30.在dealloc方法中只釋放引用并解除監(jiān)聽(tīng)
- 在dealloc方法里,應(yīng)該做的事情就是釋放指向其他對(duì)象的引用,并取消原來(lái)訂閱的“鍵值觀測(cè)”或NSNotificationCenter等通知,不要做其他的事情。
- 如果對(duì)象持有文件描述符等系統(tǒng)資源,那么應(yīng)該專門編寫一個(gè)方法來(lái)釋放這些資源。這樣的類,要和其他的使用者約定:用完資源后必須調(diào)用close方法。
- 執(zhí)行異步任務(wù)的方法不應(yīng)該在dealloc里調(diào)用;只能在正常狀態(tài)下執(zhí)行的那些方法也不應(yīng)該在dealloc里調(diào)用,因?yàn)榇藭r(shí)對(duì)象已經(jīng)處于正在回收的狀態(tài)了。
31.編寫“異常安全代碼”時(shí)留意內(nèi)存管理問(wèn)題
- 捕獲異常時(shí),一定要注意將try塊內(nèi)所創(chuàng)立的對(duì)象清理干凈。
- 在默認(rèn)情況下,ARC不生成安全處理異常所需的清理代碼。開(kāi)啟編譯器標(biāo)志后,可聲場(chǎng)這種代碼,不過(guò)會(huì)導(dǎo)致應(yīng)用程序變大,而且會(huì)降低運(yùn)行效率。
32.保留環(huán)
- 即循環(huán)引用,請(qǐng)參考 (二十四)[Swift]循環(huán)引用,雖然是swift,原理是一樣的
33.自動(dòng)釋放池
- 每個(gè)線程默認(rèn)都會(huì)有自動(dòng)釋放池,每次執(zhí)行事件循環(huán)都會(huì)將其清空
- 合理使用自動(dòng)釋放池,可以降低內(nèi)存峰值,比如下面這兩段代碼的內(nèi)存峰值是不一樣的
//不用內(nèi)存釋放池
NSMutableArray *array = [NSMutableArray array];
for (int i=0; i<10000; i++) {
[array addObject:[NSString string]];
}
//使用內(nèi)存釋放池
NSMutableArray *array2= [NSMutableArray array];
for (int i=0; i<10000; i++) {
@autoreleasepool {
[array2 addObject:[NSString string]];
}
}
34.用僵尸對(duì)象調(diào)試內(nèi)存管理問(wèn)題
-
系統(tǒng)在回收對(duì)象時(shí),可以不將其真的回收,而是把它轉(zhuǎn)化為僵尸對(duì)象。通過(guò)下面這個(gè)方式開(kāi)啟僵尸對(duì)象
開(kāi)啟僵尸對(duì)象.gif 系統(tǒng)會(huì)修改isa指針,令其指向特殊的僵尸類,從而使該對(duì)象變?yōu)榻┦瑢?duì)象。僵尸類能夠相應(yīng)所有的選擇子,響應(yīng)方式為:打印一條包含消息內(nèi)容及其接受者的消息,然后終止應(yīng)用程序。
35.不要使用retainCount
- 對(duì)于保留計(jì)數(shù)看似有用,實(shí)則不然,因?yàn)槿魏谓o定時(shí)間點(diǎn)上的"絕對(duì)保留計(jì)數(shù)"都無(wú)法反映對(duì)象生命期的全貌
- 引入ARC之后,retainCount方法正是廢紙,在ARC下調(diào)用該方法會(huì)導(dǎo)致編譯器
