
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)存的操作);