
如上圖這杯雞尾酒.Autoreleasepool與他有相似之處.
1.Autoreleasepool其實(shí)就是由很多個(gè)AutoreleasePoolPage對(duì)象組成的一個(gè)雙鏈表.就像很多個(gè)并排的酒杯.??????????
2.每個(gè)AutoreleasePoolPage就像一個(gè)裝著雞尾酒的杯子,杯子+里面的酒質(zhì)量有4K.
3.現(xiàn)在,有一個(gè)Autoreleasepool - push()了,就相當(dāng)于拿到了一個(gè)空杯子(AutoreleasePoolPage質(zhì)量為56字節(jié)).并且加入一個(gè)柵欄..(POOL_SENTINEL哨兵:可以理解為漂浮在雞尾酒某顏色層分界處的柵欄,提示你一口氣只能喝這么多酒...)
4.現(xiàn)在開(kāi)始注入酒了(被標(biāo)記為autorelease的對(duì)象入棧),第一次注入了三種顏色,紅、黃、藍(lán).目前杯子里從上到下變成了:藍(lán) - 黃 - 紅 - 柵欄.如圖.
5.現(xiàn)在又調(diào)用了Autoreleasepool - push().又要加入一個(gè)漂浮柵欄.然后加入了顏色為,白、綠的酒(被標(biāo)記為autorelease的對(duì)象入棧).那么酒杯中變成了什么呢?對(duì)了,是綠 - 白 - 柵欄 - 藍(lán) - 黃 - 紅 - 柵欄.
6.現(xiàn)在開(kāi)始罰你喝酒了.也就是Autoreleasepool - pop(void *token)..先喝了綠 - 白 - 柵欄...碰到你必須喝到的那個(gè)柵欄了..我就不能再喝了,我需要把柵欄掏出來(lái),畢竟你喝進(jìn)去一個(gè)柵欄,是要進(jìn)醫(yī)院的...(??token是柵欄的地址!!!)
7.如果你有多個(gè)酒杯怎么辦?當(dāng)然是一個(gè)一個(gè)喝了,直到喝到某個(gè)酒杯里有那個(gè)你需要喝到的柵欄為止.(static inline void pop(void *token) token 是 POOL_SENTINEL的地址就是柵欄的位置)
8.每喝一層顏色的酒,就相當(dāng)于對(duì)某個(gè)被標(biāo)記為autorelease的對(duì)象做一次release.
9.酒杯喝完了就摔了(AutoreleasePoolPage page->kill())
??特殊情況:如果喝到某一杯的柵欄,發(fā)現(xiàn)這杯酒還有一半以上沒(méi)有喝,就不摔掉前一個(gè)杯子,為什么呢?因?yàn)橄乱淮渭泳?當(dāng)前杯子很大概率不夠裝,需要一個(gè)杯子,不摔上一個(gè)杯子,就節(jié)約了成本...真機(jī)智啊..其實(shí)屁用沒(méi)有..
10.我現(xiàn)在一次要調(diào)好1000層酒怎么辦?(一個(gè)page大概裝(4096總質(zhì)量 - 56(杯子占用質(zhì)量)) / 8(指針占用質(zhì)量),質(zhì)量可理解為內(nèi)存空間. = 505).第一步找到當(dāng)前杯子,看看滿不滿,不滿就往里加一個(gè)柵欄(POOL_SENTINEL),然后開(kāi)始一層一層注入酒,當(dāng)一個(gè)杯子滿了,再造一個(gè)杯子..重復(fù)3.里面的邏輯.
好了,這就是我理解的Autoreleasepool簡(jiǎn)略版理解.
其實(shí)我也有個(gè)問(wèn)題,就是棧是由高地址向低地址排列的,但是這里,是從低地址往高地址走...
另外有什么錯(cuò)誤希望大家指正.