五、內(nèi)存管理
自動(dòng)引用計(jì)數(shù)(Automatic Reference Counting续滋, ARC)
29.理解引用計(jì)數(shù)
- 引用計(jì)數(shù)機(jī)制通過(guò)遞增遞減的計(jì)數(shù)器來(lái)管理內(nèi)存。創(chuàng)建成功后是 1蜡峰, 降為0時(shí)對(duì)象銷(xiāo)毀朗恳。
- 對(duì)象生命周期中,其余對(duì)象通過(guò)引用來(lái)保留或釋放次對(duì)象粥诫。保留怀浆、釋放操作對(duì)象的計(jì)數(shù)器遞增、遞減执赡。
引用計(jì)數(shù)工作原理
引用計(jì)數(shù)架構(gòu)下,對(duì)象有個(gè)計(jì)數(shù)器根據(jù)計(jì)數(shù)的字來(lái)確認(rèn)是否釋放對(duì)象或者保留余境,Object-C 中叫“保留計(jì)數(shù)”(retain count)/“引用計(jì)數(shù)”(reference count)灌诅。
- Retain:遞增
- release: 遞減
- autorelease: 自動(dòng)釋放池(autorelease pool)
例子(MRC情況下手動(dòng)添加釋放 retain count):
NSMutableArray *array = [[NSMutableArray alloc] init];
NSNumber *number = [[NSNumber alloc] initWithInt:1000];
[array addObject:number];
[number release];
//do something with 'array'
[array release];
保留環(huán)(retain cycle)
環(huán)狀互相引用多個(gè)對(duì)象猜拾,導(dǎo)致內(nèi)存泄漏。
解決方案:1. “弱引用”(weak reference) 2.從外界命令循環(huán)中的某個(gè)對(duì)象不再保留另一個(gè)對(duì)象顽聂。
30.以ARC簡(jiǎn)化引用計(jì)數(shù)
- 手動(dòng)“保留”盯仪、“釋放”->自動(dòng)化。
- ARC只負(fù)責(zé)Objective-C對(duì)象的內(nèi)存耀石。
變量:ARC 爸黄,先保留新值揭鳞,再釋放舊值梆奈,最后設(shè)置實(shí)例變量。
31.在dealloc方法中釋放引用并解除監(jiān)聽(tīng)
- 在dealloc方法里亩钟,應(yīng)該做的事情就是釋放指向其他對(duì)象的引用径荔;取消原來(lái)訂閱的“鍵值觀察”(KVO)/NSNotificationCenter。
- 如果對(duì)象持有文件描述符等系統(tǒng)資源总处,應(yīng)該專門(mén)編寫(xiě)一個(gè)方法來(lái)釋放。 (close)
- 執(zhí)行異步任務(wù)的方法不應(yīng)在dealloc里調(diào)用胧谈;正常狀態(tài)的方法也不應(yīng)該荸频。
32.編寫(xiě)“異常安全代碼”時(shí)留意內(nèi)存管理問(wèn)題
- 捕獲異常時(shí),一定要注意將try塊內(nèi)創(chuàng)立的對(duì)象清理干凈稳强。
- 在默認(rèn)情況下和悦,ARC 不生成安全處理異常所需要的清理代碼。 開(kāi)啟編譯器標(biāo)志 后鸽素,可生成這種代碼,不過(guò)會(huì)導(dǎo)致應(yīng)用程序變大棒坏,并降低運(yùn)行效率遭笋。
33.以弱引用避免保留環(huán)
- 將某些引用設(shè)為weak,可避免出現(xiàn)“保留環(huán)”
- weak 引用可以自動(dòng)清空徽诲,也可以不自動(dòng)清空吵血。自動(dòng)清空(autoniling)隨ARC引入的新特性,由運(yùn)行期系統(tǒng)來(lái)實(shí)現(xiàn)钱贯。
34.以“自動(dòng)釋放池塊”降低內(nèi)存峰值
- 略
35.用“僵尸對(duì)象”調(diào)試內(nèi)存管理問(wèn)題
- 略
36.不要使用retainCount
- retainCount 比較雞肋的功能侦另,無(wú)法放映對(duì)象生命期的全貌。
- 引入ARC 后褒傅,retainCount方法已經(jīng)正式廢止。