自動釋放池什么時候釋放?

AutoreleasePool
  • 第一次創(chuàng)建:啟動runloop
  • 最后一次銷毀:runloop退出時
  • 其他時候的創(chuàng)建和銷毀:當runloop即將進行休眠狀態(tài)時會銷毀舊的釋放池,并創(chuàng)建一個新的釋放池。

如果在正常情況下,一般是超出其作用域就會立即釋放
如果將臨時變量加入了自動釋放池,會延遲釋放,即在runloop休眠或者autoreleasepool 作用域之后釋放

  • runloop就是iOS中的消息循環(huán)機制,當一個runloop結(jié)束時系統(tǒng)才會一次性清理掉被autorelease處理過的對象,其實本質(zhì)上說是在本次runloop迭代結(jié)束時清理掉被本次迭代期間被放到autorelease pool中的對象的。至于何時runloop結(jié)束并沒有固定的duration!
  • 當一個autorelease pool被drain 的時候,會對pool里的每一個對象發(fā)送一個release消息;
  • 每一個線程(包括主線程)都有一個AutoreleasePool棧。當一個新的池子被創(chuàng)建的時候,push進棧,當池子被釋放內(nèi)存時,pop出棧。對象調(diào)用autorelease方法進入棧頂池子中。當線程結(jié)束的時候,會自動地銷毀所有跟它有關(guān)聯(lián)的池子;
  • 使用容器的block版本的枚舉器時,內(nèi)部會自動添加一個AutoreleasePool:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// 這里被一個局部@autoreleasepool包圍著
}];

在普通for循環(huán)和for in循環(huán)中沒有,當for循環(huán)中便利產(chǎn)生大量autorelease變量時,就需要手動加局部AutoreleasePool。

什么時候用AutoreleasePool:

  • 寫給予命令行的程序時,就是沒有UI框架;
  • 寫循環(huán),循環(huán)里邊包含了大量臨時創(chuàng)建的對象;
  • 創(chuàng)建了新的線程;
  • 長時間在后臺運行的任務(wù);
  • 合理運用自動釋放池,可以降低程序的內(nèi)存峰值,異步的方式將文件保存在磁盤(SDWebimage里邊異步保存圖片到磁盤,類似的占用內(nèi)存的操作);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容