<a >Effective Objective C 2.0:編寫高質量iOS與OS X代碼的52個有效方法</a>
第 29 條:理解引用計數###
要點:####
- 引用計數機制通過可以遞增遞減的計數器來管理內存.對象創建好之后,其保留計數至少為1.若保留計數為正,則對象繼續存活.當保留計數為0時,對象就被銷毀了.
- 在對象生命期中,其余對象通過引用來保留或釋放此對象.保留和釋放操作分別會遞增或遞減保留計數.
第 30 條:以ARC簡化引用計數###
要點:####
- 在ARC之后,程序員就無須擔心內存管理問題了.使用ARC來編程,可省去類中很多的樣板代碼.
- ARC管理對象的生命期方法基本上就是:在合適的地方插入"保留"或"釋放"操作.在ARC環境下,變量的內存管理語義可以通過修飾符指明,而原來則需要手工執行"保留"及"釋放"操作.
- 由方法所返回的對象,其內存管理語義總是通過方法名來體現.ARC將此確定為開發者必須遵守的規則.
- ARC只負責管理OC對象的內存.尤其要注意,CoreFoundation對象不歸ARC管理,開發者必須適時調用CFRetain/CFRelease.
第 31 條:在dealloc方法中只釋放引用并解除監聽###
要點:####
- 在dealloc方法里,應該做的事情就是釋放指向其他對象的引用,并取消原來訂閱的"鍵值觀測"(KVO)或NSNotificationCeter等通知,不要做其它事情.
- 如果對象持有文件描述符等系統資源,那么應該專門編寫一個方法來釋放此種資源.這樣的類要和其它使用者約定:用完資源后必須調用close方法.
- 執行異步的方法不應在dealloc里調用;只能在正常狀態下執行的那些方法也不應在dealloc里調用,因為此時對象己正在回收的狀態了.
第 32 條:編寫"異常安全代碼"時留意內存管理問題###
要點:####
- 捕獲異常時,一定要注意將try塊內所創立的對象清理干凈.
- 在默認情況下,ARC不生成安全處理異常所需的清理代碼.開啟編譯器標志后,可生成這種代碼,不過會導致應用程序變大,而且會降低運行效率.
第 33 條:以弱引用避免保留環###
要點:####
- 將某些引用設為weak, 可避免出現"保留環".
- weak引用可以自動清空,也可以不自動清空.自動清空(autoniling)是隨著ARC而引入的新特性,由運行期系統來實現.在具備自動清空功能的弱引用上,可以隨意讀取其數據.因為這種引用不會指向已經回收過的對象.
第 34 條:以"自動釋放池塊"降低內存峰值###
要點:####
- 自動釋放池排布在棧中,對象收到autorelease消息后,系統將其放入最頂端的池里.
- 合理運用自動釋放池,可降低應用程序的內存峰值.
- @autoreleasepool 這種新式寫法能創建出更為輕便的自動釋放池.
第 35 條:用"僵尸對象"調試內存管理問題###
要點:####
- 系統在回收對象時,可以不將其真的回收,而是把它轉化為僵尸對象.通過環境變量NSZombieEnabled可開啟此功能.
- 系統會修改對象的isa指針,令其指向特殊的僵尸類,從而使該對象變為僵尸對象.僵尸類能夠響應所有的選擇子,響應方式為:打印一條包含消息內容及其接收者的消息,然后終止應用程序.
第 36 條:不要使用retainCount###
要點:####
- 對象的保留計數看似有用,實則不然.因為任何給定時間點上的"絕對保留計數"(absolute retain count)都無法反映對象生命期的全貌.
- 引用ARC之后, retainCount方法就正式廢止了,在ARC下調用該方法會導致編譯器報錯.