(三十-三十五)[OC高效系列]

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)

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)致編譯器
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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