以下內容主要是學習《Effective Objective-C 2.0》所做的筆記,我所購買的原書為英文原版,由於自己英文水平有限,理解可能有疏漏
原書購買地址:亞馬遜
3、Interface and API Design
Item 15: Use Prefix Names to Avoid Namespace Clashes
一些知識點:
(1)由於蘋果公司的系統架構名都是以兩個字母開頭的,所以為了避免與之衝突,開發人員定義的命名首碼至少採用三個字母開頭。
(2)由於修改第三方庫首碼名,要注意不要重複引用第三方庫。
要記住的:
(1)選擇一個適合你公司、應用或兩者的首碼名,然後嚴格的執行這條首碼命名。
(2)如果你使用第三方庫作為獨立的引用,考慮給它加上你自己的首碼名。
Item 16: Have a Designated Initializer
要記住的:
(1)在你自己編寫的類中實現一個定製的初始函數,並且給出文檔說明是哪個。其他的初始函數調用都必須通過這個定製的初始函數。
(2)如果定製的初始函數與父類的不相同,確保父類的初始函數在子類中被重寫。
(3)重寫的父類的初始函數需要拋出異常避免在子類中被調用。
Item 17: Implement the description Method
一些知識點:
(1)description方法在NSLog對象時被調用,debugDescription方法只在調試時執行po命令時被調用
要記住的:
(1)實現description方法,在description函數中提供一個有意義的字串。
(2)如果對象在調試時需要顯示更多詳細的資訊,可以實現debugDescription方法
Item 18: Prefer Immutable Objects
一些知識點:
(1)當某property設定為readonly時不需要設定copy、assign等寫屬性。
要記住的:
(1)儘可能的建立不可變更的對象。
(2)如果需要在內部設定可變更屬性可以在類延續類別中設定readwrite而在介面標頭檔中設定readonly。
(3)為屬性提供讀寫方法比在property中直接設定可變更屬性要更好。
Item 19: Use Clear and Consistent Naming
一些知識點:
(1)關於方法命名的一些建議:
a、如果方法返回的一個新建立的值,那麼方法名的第一個單詞最好是這個值的類型,除非有必要的限定詞需要添加在類型的前面。
b、一個描述參數類型的名詞需要直接出現在參數的前面。
c、如果方法包含對某對象的某種操作,需要在參數前面的名詞後面增加一個表示行為的動詞,用以明確的表達何種操作。
d、禁止在方法名中使用縮寫,如用str代替string。
e、在bool類型的屬性方法前增加is。一個方法返回一個bool類型需要根據需要在前面增加一個has或is。
f、在擷取數值的方法名前需要增加get。
(2)關於類和協議命名的一些建議:
a、在自訂類前面需要增加必要的namespace。
b、整合一個類注意最後一個單詞需要明晰父類的類型。
c、Delegate命名需要以Delegate單詞結尾。
要記住的:
(1)按照基本的Objective-C介面命名來擴充命名自己的方法和類等。
(2)確保方法名簡潔但明確,能夠從左至右讀起來就像一個句子一樣。
(3)禁止使用簡寫。
(4)最重要的是,確保你的命名方法一致,或者與需要組入的模組一致。
Item 20: Prefix Private Method Names
一些知識點:
(1)可以考慮使用p_作為私人方法首碼。
要記住的:
(1)給私人方法增加一個特殊的首碼以便於與公用方法區分開來。
(2)禁止使用單獨的底線作為方法的首碼,因為蘋果自己的方法使用了這一規則,避免重寫蘋果的私人方法。
Item 21: Understand the Objective-C Error Model
一些知識點:
(1)使用-fobjc-arc-exceptions標誌就可以使用異常安全的ARC。但仍然不建議在Objective-C中使用異常,異常容易導致記憶體泄露降低程式效能和崩潰。
(2)異常在Objective-C中的用處之一是在某些需要繼承使用的抽象類別方法中使用,如果這些必須繼承重寫的方法沒有被重寫,則拋出異常。
(3)異常只用於某些致命的錯誤。對於非致命的錯誤通常採用返回nil/0的方式或者返回NSError。
(4)NSerror通常包含3個內容:
a、Error domain (String)定義了錯誤發生的域。
b、Error code (Integer)全域唯一的定義了一個錯誤域的識別碼。通常是一個enum。
c、User info (Dictionary)包含了錯誤的額外資訊或者其他表述錯誤的資訊。
(5)通常一個對象通過代理協議將一個NSError傳輸出去。
(6)另一個傳輸NSError的方法是使用參數方法。使用一個指向指標的指標作為NSError參數類型。如果不關心錯誤的詳細內容,可以返回一個布爾值作為調用成功失敗的判斷標誌。
(7)當NSError作為參數返回判斷錯誤時,需要先判斷返回的NSError是否為空白,再讀取NSError的具體值。
要記住的:
(1)只在擷取致命錯誤並導致程式崩潰的情況下才考慮使用異常方式。
(2)對於非致命錯誤,考慮使用代理方法傳出NSError或者外部參數方法傳輸NSError。
Item 22: Understand the NSCopying Protocol
要記住的:
(1)如果所建立的對象需要被複製,則需要實現NSCopying協議。
(2)如果你所建立的對象同時包含可變更的和不可變更的變數,需要同時實現NSCopying和NSMutableCopying兩個協議。
(3)確定一個拷貝是深拷貝還是淺拷貝,如果可能的話,大多數情況更偏向於實現淺拷貝。
(4)如果你的對象需要深拷貝的話,要考慮增加一個深拷貝的方法。