Effective Objective-C 2.0 觀後感《一》
1.多用字面量語法,可讀性較強
2.儘量使用“向前申明”,而不是直接在標頭檔案中匯入。
3.儘量少用預處理指令來定義變數,換做型別常量static const/ extern NSString * const str來替代;
4.儘量使用列舉來定義狀態,選項,狀態碼。可讀性更強
5.理解NS_Enum和NS_Options來定義列舉的差異,進不進行位運算,2的冪次方
6.用switch處理列舉型別的值時,儘量不要實現default分支,這樣的話加入新的列舉之後,編譯器就會提示開發者,switch語句並沒處理所有的列舉
7.理解物件和訊息傳遞
8.理解屬性,關鍵字:@synthesize name = _name; @dynamic name;
9.理解屬性特質分為四種類型:1.原子性 (atomic,nonatomic)2.讀寫許可權(readonly,readwrite)3.記憶體管理(assign,weak,strong,copy,unsafe_unretained)4.方法名(getter,setter)
1>>.原子性:atomic存取方法中新增同步鎖,增加效能損耗,macOS環境下沒有此風險;nonatomic常與@synchronized來搭配使用起到同步鎖的作用.
2>>.讀寫許可權:
assign:常用來修飾非OC物件的基本資料型別,如果用來修改OC物件,效果類似於weak不能增加引用計數,但是有點不一樣的是當被指向物件被釋放時,assign修改的只指標物件不會被釋放,會實誠“野指標”,會產生EXC_BAD_指標錯誤。
weak:常用來修改OC物件,不會增加引用技術,和strong相對應。當指向地址被釋放時,指標自動被釋放。
strong:增加引用計數.設定方法先會保留新值,並釋放舊值,然後再將新值設定上去。
copy:將新值進行一份拷貝,常用來保護不想被修改的資料的型別。
unsafe_unretain:特質與assign很相似,適用於OC物件型別,目標物件銷燬時,也不會被釋放。
3>>.getter=<name>
@property(nonatomic,getter=isOn)BOOL on;
10.在物件內部儘量直接使用例項變數來訪問,而寫入資料時最好採用“點語法”訪問,其中涉及到“方法派發”,“鍵值觀測”
-setName:(NSString *)name{
self.name = name;
}
- (NNString *)name{
return _name;
}
11.在初始化方法以及dealloc方法中,總是應該訪問例項變數來讀取資料。
12.在使用了“惰性初始化”(懶載入)技術時,必須使用屬性的來讀取資料。不然會導致沒法初始化。
- (EOCBrain *)brain{
if(_brain){
_brain = [EOCBrain new];
}
return _brain;
}
13.理解“物件等同性”,理解“==”和“isEqual”的區別。
//驗證“==”與“isEqual”的區別
NSString *str1 = @"lenka";
NSString *str2 = [NSString stringWithFormat:@"lenka"];
NSString *str3 = @"1";
NSNumber *number = @1;
NSLog(@"%d",str1 == str2);// false
NSLog(@"%d",[str1 isEqual:str2]); //true
NSLog(@"%d",[str1 isEqualToString:str2]);//true
NSLog(@"%d",[str3 isEqual:number]);//false
究其原因:“==”操作符比較的是指標地址是否相同,而“isEqual”比較的是物件的資料型別和值是否相同,當確定是NSString型別的資料進行比較時,採用“isEqualToString”的比較速度較快。
14.
a.若想檢測物件的等同性,請提供“isEqual”和hash方法。
b.相同的物件一定具有相同的雜湊碼,但是具有相同雜湊碼的物件不一定相同。
c.不要盲目地逐條檢測每個屬性,而是應該依照具體需求來制定檢測方案.
d.編寫hash方法時,應該使用計算速度快且雜湊碼碰撞機率低(碰撞指的是可能相同)的演算法。
15."方法調配"
Method originMehtod = class_getInstanceMethod([NSString class],@selector(lowercaseString));
Method swappedMethod = class_getInstanceMethod([NSString class],@@selector(uppercaseString));
method_exchangedImplemetation(originMehtod,swappedMethod);
16.每個例項都有一個指向Class物件的指標isa,用以表明其型別,而這些Class物件構成了類的繼承體系;如果物件型別在編譯期間無法確認,那麼應該使用型別資訊查詢方法來探知(isKindOf,isMemberOf);儘量使用型別資訊查詢方法來確定物件的型別,而不要直接比較(==)類物件。因為某些物件可能實現了訊息轉發功能。
API與介面設計
1.使用字首避免名稱空間衝突,apple保留“兩字母字首”的使用權利。
字首的命名規則:專案名稱簡寫,公司名稱等。