以下內容主要是學習《Effective Objective-C 2.0》所做的筆記,我所購買的原書為英文原版,由於自己英文水平有限,理解可能有疏漏
原書購買地址:亞馬遜
2、Objects, Messaging, and the Runtime
Item 6: Understand Properties
一些知識點:
(1)永遠不要在init方法或者dealloc方法中調用self.方法;
(2)在iOS中使用nonatomic,因為atomic的使用會嚴重影響效能(可能是我對英文理解有誤,這一條我不太理解)。
要記住的:
(1)@property 文法提供了定義資料所包含屬性的方法。
(2)為儲存的資料提供正確的語義屬性。
(3)確保任何地方屬性的執行個體變數都被設定好,所聲明的語義都實現。
(4)在iOS中盡量使用nonatomic ,因為使用atomic會大大影響效能。
Item 7: Access Instance Variables Primarily Directly When Accessing Them Internally
要記住的:
(1)當在內部操作執行個體變數時應該採用讀取時直接讀取執行個體變數而寫入時通過self.方法;
(2)永遠不要在init方法或者dealloc方法中調用self.方法;
(3)當某個樣本變數使用懶載入模式時,需要使用self.方法讀取。
Item 8: Understand Object Equality
一些知識點:
(1)通常==比較的是指標而不是指標所指向的內容;
要記住的:
(1)如果你想對對象進行比較操作的話,需要為對象提供isEqual:方法和hash方法。
(2)相等的對象必須含有相同的hash,但具有相同hash的對象沒必要相等;
(3)確定比較對象時必要的屬性而不是草率的比較每一個屬性。
(4)編寫hash方法可以提供一個快速合理的比較不同的方法。
Item 9: Use the Class Cluster Pattern to Hide Implementation Detail
要記住的:
(1)類叢集模式可以用於隱藏實現的詳細細節,為調用提供一個簡單的介面。
(2)類叢集模式常用於系統架構。
(3)在編寫一個類叢集模式的抽象類別子類時需要非常小心,如果有文檔的話,一定要仔細閱讀。
Item 10: Use Associated Objects to Attach Custom Data to Existing Classes
一些知識點:
(1)objc_setAssociatedObject ; objc_getAssociatedObject.
要記住的:
(1)關聯對象提供了串連兩個對象的一系列方法。
(2)關聯對象的記憶體管理語義可以被定義為類比擁有(mimic owning不知道咋翻譯)或沒有擁有(nonowning咋翻譯合適?)關係。
(3)只有在別的方法都不能用的情況下才考慮使用關聯對象,因為關聯對象會造成難以發現的bug。
Item 11: Understand the Role of objc_msgSend
一些知識點:
(1)objc_msgSend
要記住的:
(1)一個訊息通常包含一個接受者,一個選取器和一些參數。調用一個訊息就是同時調用了某個對象的一個方法。
(2)當訊息被調用,所有的訊息通過動態訊息分配系統尋找實現方法並運行。
Item 12: Understand Message Forwarding
一些知識點:
(1)resolveInstanceMethod -> forwardingTargetForSelector -> forwardInvocation -> Message not handled
要記住的:
(1)訊息轉寄過程是指一個對象在沒有發現合適的選取器時按流程傳送的過程。
(2)動態方法解決方案通常在運行時和需要調用時動態添加一些方法。
(3)對象可以聲明另一個對象用於解決某問題的選取器。
(4)只在所有的前置方法都沒辦法解決時才進行全轉寄。
Item 13: Consider Method Swizzling to Debug Opaque Methods
一些知識點:
(1)class_getInstanceMethod ; method_exchangeImplementations
(2)可以在運行時添加和交換方法
(3)僅用於調試,不要濫用
要記住的:
(1)為一個選取器提供的方法實現可以在運行時被添加和替換。
(2)交叉混合是把某對象的方法交換給另一個的過程,通常添加一個原實現添加一些函數。
(3)通常只在用於調試時才會在運行時幹預方法的實現,不要因為可以這樣做就濫用幹預。
Item 14: Understand What a Class Object Is
要記住的:
(1)類的階層是一個貫穿類的所有對象執行個體的類型指標指向模型。(這個翻譯有很大問題,我沒能完全理解願意)
(2)當在編譯時間無法確定對象的類型時需要使用內省方法。
(3)優先使用內省方法isMemberOfClass和isKindOfClass比較兩個類而不是==,避免對象的訊息轉寄。