Accustoming Yourself to Objective - C
- Objective - C是C的超集,并為其增加了面向對象的功能,Objective - C通過動態綁定實現消息傳遞機制,也就意味著對象類型是在運行時決定的.Runtime通過給定的消息來決策,而不是編譯器.
- 理解C語言的核心概念有助于編寫高效的Objective - C代碼。特別是你需要理解內存模型和指針.
Minimize Importing Headers in Headers
- 盡可能的在深層里面導入頭文件,這意味著需要在
.h
中使用向前聲明,在對應的.m
中導入對應的頭文件.這樣做的好處是可以盡量避免耦合.
- 有時,可能無法使用向前聲明,比如在聲明協議的時候.這種情況下,可以考慮把協議的聲明轉移到分類中去.否則只有在定義一個協議的時候才會導入頭文件
Prefer Literal Syntax over the Equivalent Methods
- 使用字面量語法來創建字符串(strings),數字類型(numbers),數組(arrays),詞典(dictionaries).這種方式比使用標準的對象方法創建更為簡潔明了.
- 訪問數組和詞典中的元素使用,腳標(subscript)的方式.
- 在使用字面量方式創建數組和詞典的時候,如果有nil元素的存在,則會導致異常的拋出.所以,要確保值不為nil.
Prefer Typed Constants to Preprocessor #define
- 使用常量來代替宏定義,并且要寫在
implementation
里面
// 不推薦
#define ANIMATION_DURATION 0.3
// 推薦,并且已定要同時使用static和const修飾符.
static const NSTimeInterval kAnimationDuration = 0.3;
- 如果你需要在.h中暴露一個全局的標志給外界,那么你應該使用如下定義方式
extern NSString *const EOCStringConstant;
// 實現文件中
NSString *const EOCStringConstant = @"VALUE";
- 避免使用宏定義,宏定義不能挾帶任何信息,僅僅只是簡單的使用一個標志去代替某些值.當你不小心重定義了之前的宏定義,是收不到任何警告的.
Use Enumerations for States,Options,and Status Codes
- 在使用枚舉來定義狀態值(states),選擇項(options)或者錯誤標志(error status code)的時候,使用可讀性較強的名字
- 如果使用枚舉來定義一個選擇項的的時候,并且選項有多個,使用位運算來定義各項的值,這樣方便多個狀態一起出現
- 使用
NS_ENUM
和NS_OPTIONS
宏定義來定義枚舉
Understand Properties
- 關于使用
iva
和property
到底哪個更好,這個爭論一直是個熱門話題.一般寫法大致如下
@interface EOCPerson : NSObject
{
// instance variables
NSString *_fullName;
NSString *_sex;
}
// property
@property (nonnatomic, copy) NSString *firstName;
@property (nonnatomic, copy) NSString *lastName;
@end
兩種寫法有以下幾點不同
- 使用實例變量毫無疑問更快,因為它不會調用Objective - C的
dispatch
方法.編譯器會直接發送代碼去訪問實例變量所在區域的內存.
- 使用
property
的內存管理語法來定義對象并自動生成相應的setter
和getter
來訪問對象,會先執行相應的內存管理方法,比如你定義了一個copy
類型的property
,新值會先retain
,然后舊值才會被釋放
- 直接訪問實例變量不會觸發KVO通知,這是一個可有可無的問題,當然這取決于對象的行為
-
property
更易于調試,你可以給property的setter
和getter
加上斷點,然后看看是誰在什么時候訪問了property
.
推薦按如下方式使用
- 讀取數據的時候使用實例變量,寫數據的時候使用property
- 在初始化方法和
dealloc
里面無論讀數據還是寫數據都要直接使用實例變量
- 使用懶加載的時候使用property來讀數據
Understand Object Equality
- 在比較兩個對象是否相同的時候,使用
isEqual:
來比較,而不是==
- 當你想為自定義對象實現一個
isEqual:
方法的時候,不要忘記一同實現hash
方法
- 相同的兩個對象,他們的
hash
一定相等,但是擁有相同hash
的兩個對象,不一定相等
- 最終能決定的是是否需要測試相等,而不是測試每一個
property
- 實現
hash
方法固然快捷,但這只是一個看起來明智實則低級的錯誤
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。