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