iOS 內存管理

<a >Effective Objective C 2.0:編寫高質量iOS與OS X代碼的52個有效方法</a>

第 29 條:理解引用計數###

要點:####

  1. 引用計數機制通過可以遞增遞減的計數器來管理內存.對象創建好之后,其保留計數至少為1.若保留計數為正,則對象繼續存活.當保留計數為0時,對象就被銷毀了.
  2. 在對象生命期中,其余對象通過引用來保留或釋放此對象.保留和釋放操作分別會遞增或遞減保留計數.

第 30 條:以ARC簡化引用計數###

要點:####

  1. 在ARC之后,程序員就無須擔心內存管理問題了.使用ARC來編程,可省去類中很多的樣板代碼.
  2. ARC管理對象的生命期方法基本上就是:在合適的地方插入"保留"或"釋放"操作.在ARC環境下,變量的內存管理語義可以通過修飾符指明,而原來則需要手工執行"保留"及"釋放"操作.
  3. 由方法所返回的對象,其內存管理語義總是通過方法名來體現.ARC將此確定為開發者必須遵守的規則.
  4. ARC只負責管理OC對象的內存.尤其要注意,CoreFoundation對象不歸ARC管理,開發者必須適時調用CFRetain/CFRelease.

第 31 條:在dealloc方法中只釋放引用并解除監聽###

要點:####

  1. 在dealloc方法里,應該做的事情就是釋放指向其他對象的引用,并取消原來訂閱的"鍵值觀測"(KVO)或NSNotificationCeter等通知,不要做其它事情.
  2. 如果對象持有文件描述符等系統資源,那么應該專門編寫一個方法來釋放此種資源.這樣的類要和其它使用者約定:用完資源后必須調用close方法.
  3. 執行異步的方法不應在dealloc里調用;只能在正常狀態下執行的那些方法也不應在dealloc里調用,因為此時對象己正在回收的狀態了.

第 32 條:編寫"異常安全代碼"時留意內存管理問題###

要點:####

  1. 捕獲異常時,一定要注意將try塊內所創立的對象清理干凈.
  2. 在默認情況下,ARC不生成安全處理異常所需的清理代碼.開啟編譯器標志后,可生成這種代碼,不過會導致應用程序變大,而且會降低運行效率.

第 33 條:以弱引用避免保留環###

要點:####

  1. 將某些引用設為weak, 可避免出現"保留環".
  2. weak引用可以自動清空,也可以不自動清空.自動清空(autoniling)是隨著ARC而引入的新特性,由運行期系統來實現.在具備自動清空功能的弱引用上,可以隨意讀取其數據.因為這種引用不會指向已經回收過的對象.

第 34 條:以"自動釋放池塊"降低內存峰值###

要點:####

  1. 自動釋放池排布在棧中,對象收到autorelease消息后,系統將其放入最頂端的池里.
  2. 合理運用自動釋放池,可降低應用程序的內存峰值.
  3. @autoreleasepool 這種新式寫法能創建出更為輕便的自動釋放池.

第 35 條:用"僵尸對象"調試內存管理問題###

要點:####

  1. 系統在回收對象時,可以不將其真的回收,而是把它轉化為僵尸對象.通過環境變量NSZombieEnabled可開啟此功能.
  2. 系統會修改對象的isa指針,令其指向特殊的僵尸類,從而使該對象變為僵尸對象.僵尸類能夠響應所有的選擇子,響應方式為:打印一條包含消息內容及其接收者的消息,然后終止應用程序.

第 36 條:不要使用retainCount###

要點:####

  1. 對象的保留計數看似有用,實則不然.因為任何給定時間點上的"絕對保留計數"(absolute retain count)都無法反映對象生命期的全貌.
  2. 引用ARC之后, retainCount方法就正式廢止了,在ARC下調用該方法會導致編譯器報錯.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容