1. 程式人生 > >Effective Objective-C 2.0 觀後感《一》

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保留“兩字母字首”的使用權利。

字首的命名規則:專案名稱簡寫,公司名稱等。