Effective Objective-C 2.0讀書筆記(一)

1.頭文件的引入

  1. 盡量不要引入頭文件,特別是在.h文件中,最好使用向前聲明來提及其他類


    image
  2. 如果無法使用向前聲明,比如要聲明某個類遵循一項協議,或者要聲明一個枚舉.這種情況下盡量把協議和枚舉的聲明放到分類或者是一個單獨的.h文件中


    image

    image

2.多用字面量語法

  1. 應該使用字面量語法來創建字符串,數值,數組,字典.與創建此類對象的常規方法相比,這么做更簡明扼要.
  2. 應該通過取下標操作來訪問數組下標或字典中的鍵對應的元素
  3. 用字面量語法創建數組或字典時,若值中有nil,則會拋出異常,這樣會有助于查錯
類型 字面量語法 常規方法
數值 NSNumber *intNumber = @1; NSNumber *intNumber = [NSNumber numberWithInt:1];
數組 NSArray *animals = @[@"cat",@"dog",@"mouse",@"badger"]; NSArray *animals = [NSArray arrayWithObjects:@"cat",@"dog",@"mouse",@"badger",nil];
字典 NSDictionary *dict = @{@"key":@"value"}; NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value",@"key", nil];
類型 下標訪問 常規方法
數組 NSString *str = array[1]; NSString *str = [array objectAtIndex:1];
字典 NSString *str = dict[@"key"]; NSString *str = [dict objectForKey:@"key"];
可變數組 mutableArray[1] = @"value"; [mutableArray replaceObjectAtIndex:1 withObject:@"value"];
可變字典 mutableDict[@"key"] = mutableDict[@"value"]; [mutableDict setObject:@"value" forKey:@"key"];

3.多用類型常量,少用#define預處理指令

  1. 使用預處理指令定義常量時,這個常量不含類型信息,編譯器只是會在編譯前據此執行查找與替換操作.即使有人重新定義了常量值,編譯器也不會產生警告信息,這將導致應用程序中的常量值不一致.
#define ANIMATION_DURATION 0.3

上述預處理指令會將源代碼中的ANIMATION_DURATION字符串替換為0.3,假設此指令定義在某個頭文件中,那么導入了此頭文件的所有代碼中的ANIMATION_DURATION字符串都會被替換成為0.3,這可能會引發意想不到的問題.
此預處理指令中沒有明確指出此常量類型,duration這個詞看起來與時間有關,但沒有通過常量類型約束

static const NSTimeinterval kAnimationDuration = 0.3;

上述代碼很好的定義了一個類型為NSTiemInterval的常量,此方式包含了類型信息,這樣做清楚的描述了常量的含義.

  1. 在實現文件中使用static const來定義"只在編譯單元內可見的常量".此類常量不在全局符號表中,所以無需為其名稱加前綴.在OC的語境下,"編譯單元"一次通常指每個類的實現文件(.m文件).
static const NSTimeinterval kAnimationDuration = 0.3;
  1. 在頭文件中使用extern來聲明全局常量,并在相關實現文件中定義其值.這種常量出現在全局符號表中,所以其名稱應加以區隔,通常用與之相關的類名做前綴.
.h
extern NSString *const EOCStringConstant
.m
NSString *const EOCStringConstant = @"VALUE";

注意const在常量類型中的位置,常量定義應從右至左解讀,在本例中,EOCStringConstant就是"一個常量,這個常量是個指針,指向NSString對象"

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容