天天看點

《Effective Objective-C 2.0》2、資料的定義方法第三條:多用字面量文法,少用等價的方法第四條:固定數值多用類型常量,少用宏定義

這部分所描述的是建立foundation類的對象時的技巧。Foundation架構是iOS中至關重要的架構,iOS應用中大部分資料都可以用foundation類表示。比較常用的有NSString、NSNumber、NSArray、NSDictionary等。除此之外對于字元串、矩陣、詞典等集合類還有其"mutable"版本,如NSMutableString等,其特點是包含元素可以動态修改。

對于foundation類,建立一個對象可以同其他objective-c對象一樣使用alloc+init方法。不過,使用字面量是一種更加有效的辦法。

NSNumber類可以封裝整數、浮點數、字元、布爾值等類型。使用alloc+init方法建立一個NSNumber對象的方法:

使用字面文法的方法為:

明顯可以看出,使用字面量文法的代碼更加簡潔。

建立一個數組的方法有:

使用字面文法的方法:

也可以使用字面量文法将自定義的對象包含在數組内:

需要注意的是,在這種情況下,如果中括号内有元素為nil則程式會抛出異常。不過這也有一個好處就是可以更友善地排查錯誤所在。

NSDictionary類可以按照鍵值對的格式進行映射關系資料的存儲,建立NSDictionary對象的方法:

按照一般了解,通常的資料對應關系中“鍵”應該排在“值”的前面,是以上述寫法并不是非常符合我們的習慣思維。使用字面量文法則好得多:

同數組對象相似,字面量表示字典也會産生nil元素導緻抛出異常的問題,使用時需注意。

需要注意的是,字面量文法生成的對象都是不可變的。如果需要它的可變版本則需要做一次可變複制,例如:

定義常量時通常有兩種方式,其一是定義為一個宏,其二是定義一個常量表示:

如果采用宏定義的方法,那麼這樣的常量不包含資料類型,編譯器會将出現宏的地方做一次簡單替換。在代碼的其他地方還可能進行重複宏定義,這種情況也很難排查。是以這并非一個好的辦法。

使用常量則不存在這樣的問題。此類常量通常由static和const修飾。static表示該常量僅僅在目前的源檔案中有效,在其他源檔案中不可見。如果沒有static修飾符,則編譯器将建立一個external symbol,如果另一個源檔案中定義了同名符号将出現錯誤。const表示該變量實際為一個常量,任何視圖修改其值的行為都将觸發錯誤。

最後一點是常量不要定義在頭檔案中,而應定義在源檔案中。如果某個常量需要對其他源檔案公開,作為全局變量,應在頭檔案中聲明,源檔案中實作:

繼續閱讀