編寫(xiě)高質(zhì)量iOS與OS X代碼的52個(gè)有效方法(五)

內(nèi)存管理

引用計(jì)數(shù)工作原理

NSObject 協(xié)議聲明了下面三個(gè)方法用于操作計(jì)數(shù)器,以遞增或遞減其值
retain 遞增引用計(jì)數(shù)
release 遞減引用計(jì)數(shù)
autorelease 稍后清理“自動(dòng)釋放池”時(shí),在遞減引用計(jì)數(shù)

為避免在不經(jīng)意間使用了無(wú)效對(duì)象,一般調(diào)用完release 之后都會(huì)清空指針。這就能保證不會(huì)出現(xiàn)可能指向高無(wú)效對(duì)象的指針,這種指針通常稱(chēng)為 dangling pointer 。

屬性存取方法中的內(nèi)存管理

若屬性為“strong”所修飾時(shí),設(shè)置的屬性值會(huì)保留。

-(void)setFoo:(id)foo{
  [foo retain];
  [_foo release];
  _foo = foo;
}

此方法先保留新值,并釋放了舊值,然后更新實(shí)例變量,令其指向新值。順序很重要。假如還未保留新值就先把舊制釋放了,而且兩個(gè)值又指向同一個(gè)對(duì)象,那么限制性的release操作就可能導(dǎo)致系統(tǒng)將此對(duì)象永久回收。而后續(xù)的retain操作則無(wú)法令這個(gè)已經(jīng)徹底回收的對(duì)象復(fù)生,于是實(shí)例變量就成了懸掛指針。

return cycle

使用引用計(jì)數(shù)機(jī)制時(shí),經(jīng)常要注意的一個(gè)問(wèn)題就是 return cycle,就是呈環(huán)形狀相互引用多個(gè)對(duì)象,這將導(dǎo)致內(nèi)存泄露,因?yàn)檠h(huán)中的對(duì)象其保留計(jì)數(shù)不會(huì)降為0。對(duì)循環(huán)中的每一個(gè)對(duì)象來(lái)說(shuō),至少有另外一個(gè)對(duì)象引用著它,垃圾回收器會(huì)把相互引用的對(duì)象全部回收走,而OC 引用技術(shù)架構(gòu)中,則享受不到這種便利,通常采用 weak reference 來(lái)解決次問(wèn)題,從而避免內(nèi)存泄露。

引用計(jì)數(shù)機(jī)制通過(guò)可以遞增遞減的計(jì)數(shù)器來(lái)管理內(nèi)存。對(duì)象創(chuàng)建好后,其保留計(jì)數(shù)至少為1.若保留計(jì)數(shù)為正,則對(duì)象繼續(xù)存活。當(dāng)保留計(jì)數(shù)降為0時(shí),對(duì)象就被銷(xiāo)毀了。
在對(duì)象生命期中,其余對(duì)象通過(guò)引用來(lái)保留或釋放此對(duì)象。保留與釋放操作分別會(huì)遞增及遞減保留計(jì)數(shù)。

以ARC簡(jiǎn)化引用計(jì)數(shù)

ARC環(huán)境下回自動(dòng)執(zhí)行retain release autorelease dealloc,所以在ARC調(diào)用這些方法是非法的
在ARC之后,程序員就無(wú)須擔(dān)心內(nèi)存管理問(wèn)題了。使用ARC來(lái)編程,可省去類(lèi)中的許多樣板代碼。
ARC管理對(duì)象生命期的辦法基本上就是:在合適的地方插入保留及釋放操作。在ARC環(huán)境下,變量的內(nèi)存管理語(yǔ)義總是通過(guò)方法名來(lái)體現(xiàn)。ARC將此確定為開(kāi)發(fā)者必須遵守的規(guī)則。
ARC只負(fù)責(zé)管理Objective-C對(duì)象的內(nèi)存。尤其要注意:CoreFoundation對(duì)象不歸ARC管理,開(kāi)發(fā)者必須適時(shí)調(diào)用CFRetain/CFRelease。

在dealloc方法中只釋放引用并解除監(jiān)聽(tīng)

在dealloc方法里,應(yīng)該做的事情就是釋放指向其它對(duì)象的引用,并取消原來(lái)訂閱的鍵值觀測(cè)或NSNotificationCenter等通知,不要做其他事情。
如果對(duì)象持有文件描述符等系統(tǒng)資源,那么應(yīng)該專(zhuān)門(mén)編寫(xiě)一個(gè)方法來(lái)釋放此種資源。這樣的類(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ì)象已處于正在回收的狀態(tài)了。

以弱引用避免重復(fù)引用

將某些引用設(shè)為weak,可避免出現(xiàn)重復(fù)引用。
weak引用可以自動(dòng)清空,也可以不自動(dòng)清空。自動(dòng)清空是隨著ARC而引入的新特性,由runtime來(lái)實(shí)現(xiàn),在具備自動(dòng)清空功能的弱引用上,可以隨意讀取其數(shù)據(jù),因?yàn)檫@種引用不會(huì)指向已經(jīng)回收過(guò)的對(duì)象。

最后編輯于
?著作權(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)容