Effective Objective-C 2.0 學習筆記(五)

來源:互聯網
上載者:User

以下內容主要是學習《Effective Objective-C 2.0》所做的筆記,我所購買的原書為英文原版,由於自己英文水平有限,理解可能有疏漏

原書購買地址:亞馬遜


5、Memory  Management


Item 29: Understand Reference Counting

一些知識點:

(1)返回的參數為autorelease,如果需要賦值給執行個體變數,需要retain,並在合適的地方release。

要記住的:

(1)引用計數器記憶體管理方式基於一個不斷增加減少的計數器進行的。一個對象在被建立時計數器為1,對象在計數器為正數時存在,當計數器為0時釋放。

(2)一個對象的引用計數器在它整個生命過程中不斷被不同的對象增加和減少,各個不同的對象各自的控制他們的增加和減少操作。


Item 30: Use ARC to Make Reference Counting Easier

一些知識點:

(1)在ARC模式下禁止調用retain、release、autorelease、dealloc方法。

(2)以alloc、new、copy、mutableCopy為首碼命名的方法所返回的對象歸屬權屬於調用者。

要記住的:

(1)ARC使開發人員從複雜的記憶體管理中解放了出來。使用ARC可以大量降低類的一些樣板代碼。

(2)ARC在對象的整個生命過程中任何適當的地方增加必要的保留和釋放操作。大量有效屬性被添加以用於管理記憶體操作。

(3)方法的命名也被用於返回對象的記憶體管理參考。ARC保留了某些命名關鍵字,開發人員要謹慎使用這些命名關鍵字。

(4)ARC僅用於Objective-C對象。這意味這某些底層的對象並不適用,例如CFRetain/CFRelease方法仍然有存在的必要。


Item 31: Release References and Clean Up Observation State Only in dealloc

要記住的:

(1)dealloc 方法僅用於釋放其他對象的引用和取消一些註冊通知,比如KVO和NSNotificationCenter。

(2)如果一個對象持有了某個系統資源,比如檔案系統,則需要定義一個釋放該資源的方法。並且應該約定開發人員在調用完之後主動釋放。

(3)一些嘗試執行非同步操作方法或者假設對象處於常規狀態的方法調用禁止在dealloc方法中調用,因為執行dealloc方法時無法保證對象的狀態正常。


Item 32: Beware of Memory Management with Exception-Safe Code

一些知識點:

(1)非ARC模式下在try塊中申請的記憶體空間可以在finally塊中釋放。

要記住的:

(1)當擷取一個異常時,需要確保所有在try塊中申請的記憶體空間都已經被釋放。

(2)預設情況下,ARC模式不會對異常增加有效記憶體清理代碼。可以通過增加編譯選項解決這一問題,但這樣產生的代碼會更大並帶來更多的運行時消耗。

Item 33: Use Weak References to Avoid Retain Cycles

一些知識點:

(1)unsafe_unretained在對象被釋放後仍然指向釋放的對象;weak在對象被釋放後自動指向nil。

(2)unsafe_unretained在語義上與assign相等,但前者用於指標對象,後者用於單一資料型別。

要記住的:

(1)可以通過確定的weak屬性來打破一個循環參考。

(2)weak屬性的對象可能不會自動置空。自動置空特性是ARC在運行時實現的。自動置空的weak引用永遠可以安全的讀取,因為它永遠不會指向未分配的記憶體的對象。

Item 34: Use Autorelease Pool Blocks to Reduce High-Memory Waterline

要記住的:

(1)自動釋放池是一種棧形式的運行規則,每一個發送給自動釋放池的對象會被加在棧的最上面。

(2)當前的應用使用自動釋放池可以有效減少記憶體的消耗。

(3)最新的自動釋放池使用@autoreleasepool文法更加的有效。

Item 35: Use Zombies to Help Debug Memory-Management Problems

一些知識點:

(1)zombies屬性會將所有釋放的對象放進一個zombie對象中而不是直接清除。

要記住的:

(1)使用NSZombieEnabled標誌可以使某個被釋放的對象轉為殭屍對象而不是直接清除。

(2)一個變為殭屍對象的對象isa指標指向一個殭屍類,這個殭屍對象所接受到應該相應的所有方法都會導致程式崩潰並給出一段訊息提示。

Item 36: Avoid Using retainCount

要記住的:

(1)對象的引用計數數值看似有用實則沒有什麼太大用處,因為任何時間的引用計數數值都不能反映對象的完整生命週期。

(2)當ARC到來時,retainCount方法已經被棄用,調用該方法會導致編譯錯誤。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.