一粘捎、AutoreleasePool是什么
AutoreleasePool(自動(dòng)釋放池)是OC中的一種內(nèi)存自動(dòng)回收機(jī)制怒允,它可以延遲加入AutoreleasePool中的變量release的時(shí)機(jī)隘击。在正常情況下,創(chuàng)建的變量會(huì)在超出其作用域的時(shí)候release郭变,但是如果將變量加入AutoreleasePool拓巧,那么release將延遲執(zhí)行。
二思币、使用場景
ARC時(shí)代鹿响,在沒有手加Autorelease Pool的情況下,Autorelease對象是在當(dāng)前的runloop迭代結(jié)束時(shí)釋放的谷饿,而它能夠釋放的原因是系統(tǒng)在每個(gè)runloop迭代中都加入了自動(dòng)釋放池Push和Pop惶我。
1、降低內(nèi)存使用峰值:
這一點(diǎn)不用多說博投,當(dāng)你使用類似for循環(huán)這樣的邏輯需要產(chǎn)生大量的中間變量時(shí)绸贡,Autorelease Pool無意是最佳的一種解決方案;2毅哗、如果是對NSArray操作听怕,如果可以的話推薦使用OC提供的以下api:
- (void)enumerateObjectsUsingBlock:
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:
- (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:
3、 如果你正在編寫不基于UI 框架的程序虑绵,比如命令行工具尿瞭。
4、 你生成了一個(gè)輔助線程翅睛。 一旦線程開始執(zhí)行你必須自己創(chuàng)建自動(dòng)釋放池声搁。否則黑竞,應(yīng)用將泄漏對象。
三疏旨、實(shí)現(xiàn)原理
每個(gè)Cocoa的線程都會(huì)默認(rèn)標(biāo)配一個(gè)Autorelease Pool很魂,但是你也可以手動(dòng)創(chuàng)建多個(gè)。從前面的操作中檐涝,也應(yīng)該能隱約猜出來了些許莫换,有push和pop操作,意味著每個(gè)pool的管理其實(shí)是一種類似棧結(jié)構(gòu)的進(jìn)棧出棧操作骤铃,當(dāng)然pool的管理更復(fù)雜些拉岁,因?yàn)樗梢詣?chuàng)建多個(gè),還可以嵌套創(chuàng)建刪除
具體實(shí)現(xiàn):實(shí)現(xiàn)原理(參考1)
實(shí)現(xiàn)原理(參考2)