自動(dòng)釋放池

AutoreleasePool的創(chuàng)建和釋放

創(chuàng)建

App啟動(dòng)后暇咆,蘋果在主線程 RunLoop 里注冊(cè)了兩個(gè) Observer谤牡,其回調(diào)都是
_wrapRunLoopWithAutoreleasePoolHandler()副硅。

第一個(gè) Observer 監(jiān)視的事件是 Entry(即將進(jìn)入Loop),其回調(diào)內(nèi)會(huì)調(diào)用
_objc_autoreleasePoolPush() 創(chuàng)建自動(dòng)釋放池翅萤。優(yōu)先級(jí)最高恐疲,保證創(chuàng)建釋放池發(fā)生在其他所有回調(diào)之前。

釋放

第二個(gè) Observer 監(jiān)視了兩個(gè)事件: BeforeWaiting(準(zhǔn)備進(jìn)入休眠)
時(shí)調(diào)用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush()
釋放舊的池并創(chuàng)建新池套么;

Exit(即將退出Loop) 時(shí)調(diào)用 _objc_autoreleasePoolPop() 來釋放自動(dòng)釋放池培己。優(yōu)先級(jí)最低,保證其釋放池子發(fā)生在其他所有回調(diào)之后胚泌。

在主線程執(zhí)行的代碼省咨,通常是寫在諸如事件回調(diào)、Timer回調(diào)內(nèi)的玷室。這些回調(diào)會(huì)被 RunLoop 創(chuàng)建好的 AutoreleasePool 環(huán)繞著零蓉,所以不會(huì)出現(xiàn)內(nèi)存泄漏,開發(fā)者也不必顯示創(chuàng)建 Pool 了穷缤。

內(nèi)部實(shí)現(xiàn)

@ autoreleasepool {
    //AutoreleasePoolPage是C++類,調(diào)用它里面的push方法
    void *ctx = objc_autoreleasePoolPush(){
        void *objc_autoreleasePoolPush(void)
                           
        void *AutoreleasePoolPage::push(void)
     };
 
    //調(diào)用AutoreleasePoolPage中的pop函數(shù),一次pop實(shí)際上相當(dāng)于一次批量的pop操作
    objc_autoreleasePoolPop(ctx){
        void objc_autoreleasePoolPop(void *ctxt)
                                  
        AutoreleasePoolPage::pop(void *ctxt)
    };
}

在autoreleasepool中的所有對(duì)象,都會(huì)添加到自動(dòng)釋放池中,當(dāng)進(jìn)行pop之后, autoreleasepool中所有對(duì)象都會(huì)被發(fā)送一次release消息

AutoreleasePoolPage
  • 最下面是自身占用內(nèi)存,上面是用來存儲(chǔ)AutoreleasePool中填充的對(duì)象
  • next指針指向當(dāng)前棧的空位置
  • 每次進(jìn)行AutoreleasePool的代碼塊創(chuàng)建的時(shí)候,相當(dāng)于在棧中去插入一個(gè)【哨兵對(duì)象】
  • 進(jìn)行入棧操作時(shí),添加到next指針?biāo)赶虻奈恢玫蟹洌缓髇ext上移
[obj autorelease]方法實(shí)現(xiàn)
  • 當(dāng)一個(gè)對(duì)象的調(diào)用了autorelease方法,會(huì)將該對(duì)象添加到棧頂?shù)淖詣?dòng)釋放池中
  • 當(dāng)自動(dòng)釋放池被回收時(shí),池子里面所有對(duì)象的使用都會(huì)做一次release操作
AutoreleasePoolPage中Pop方法的實(shí)現(xiàn)

runloop將要結(jié)束的時(shí)候調(diào)用AutoreleasePoolPage的pop()方法:

  • 哨兵對(duì)象出棧
  • 池子里面所有對(duì)象的使用都會(huì)做一次release操作
  • next指針下移
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末津肛,一起剝皮案震驚了整個(gè)濱河市章喉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌身坐,老刑警劉巖秸脱,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掀亥,居然都是意外死亡撞反,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門搪花,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遏片,“玉大人嘹害,你說我怎么就攤上這事∷北悖” “怎么了笔呀?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)髓需。 經(jīng)常有香客問我许师,道長(zhǎng),這世上最難降的妖魔是什么僚匆? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任微渠,我火速辦了婚禮,結(jié)果婚禮上咧擂,老公的妹妹穿的比我還像新娘逞盆。我一直安慰自己,他們只是感情好松申,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布云芦。 她就那樣靜靜地躺著,像睡著了一般贸桶。 火紅的嫁衣襯著肌膚如雪舅逸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天皇筛,我揣著相機(jī)與錄音琉历,去河邊找鬼。 笑死水醋,一個(gè)胖子當(dāng)著我的面吹牛善已,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播离例,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悉稠!你這毒婦竟也來了宫蛆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤的猛,失蹤者是張志新(化名)和其女友劉穎耀盗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卦尊,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叛拷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岂却。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忿薇。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裙椭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出署浩,到底是詐尸還是另有隱情揉燃,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布筋栋,位于F島的核電站炊汤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弊攘。R本人自食惡果不足惜抢腐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望襟交。 院中可真熱鬧迈倍,春花似錦、人聲如沸婿着。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)竟宋。三九已至提完,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丘侠,已是汗流浹背徒欣。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜗字,地道東北人打肝。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挪捕,于是被迫代替她去往敵國(guó)和親粗梭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容