Effective Object C 2.0 『熟悉Object C』

碼碼碼碼上有錢發表於2018-02-02

第1條:Object C的起源

Object C是訊息結構的語言,執行時所應執行的程式碼由執行時環境決定的。在執行時才會去查詢要執行的方法,並不是由編譯的時候決定的。其實現原理是由執行期元件完成(runtime component),使用Objective C的物件導向特性所需的全部資料結構以及函式都在執行期元件裡面。執行期元件本質上是一種與開發者所編寫的程式碼相連結的動態庫(dynamic library),其程式碼能把開發者所編寫的所有程式粘合起來,所以只要更新執行期元件,就可以提升應用程式效能 。

Object C的物件分配到堆,物件的指標分配到棧中(32位的系統佔4個位元組,64位系統佔8個位元組)。分配到都堆中的記憶體必須直接管理,分配到棧中用於儲存變數的記憶體則會在其棧幀彈出時自動清理。

有時會遇到定義裡不含*的變數,它們可能會使用『棧空間』,例如CGRect C的結構體。

第2條:類的標頭檔案中儘量少引入其它的標頭檔案

如果類的標頭檔案中要宣告其它類的屬性,如只需要其型別不需要知道該類的全部實現細節,則只要使用『向前宣告』即可,例如在類的標頭檔案中引入 @class SomeClass,這樣可以減少編譯的時間。但如果類的實現檔案.m中要使用後者的時候,則需要引入該類的標頭檔案使用#import。

protocol儘量放單獨的標頭檔案中,如放到某類的標頭檔案中,如其它類要遵循此協議則需引入類的全部內容,產生相互依賴,增加編譯時間。

第3條:多用字面量語法,少用與之等價的語法

//no
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"kitty",@"name",@"1353**94618",@"number", nil];
NSString *str = [[NSString alloc] initWithString:@"hello kitty"];

//yes
NSNumber *intNumber = @10 ;
NSString *someString = @"hello";
NSArray *someArray =@[@"1",@"2"];
NSDictionary *someDictionary = @{@"one" : @"1",
                                 @"two" : @"2"};
複製程式碼

字面量簡潔,易讀

字面量也有不足的地方,它不能表達可變型別,但可以直接在不可變物件使用copy方法,如下:
NSMutableDictionary *someMutableDictionary = [@{@"one" : @"1",
                                                @"two" : @"2"} mutableCopy];
複製程式碼

第4條:多用型別常量,少用#define預處理指令

使用預處理指令如下:

#define ANIMATION_DURATION  0.3 
複製程式碼

預處理指令的處理方式是,在引用它的地方將所有跟ANIMATION_DURATION一樣的字串都替換為0.3,所以不太推薦此種做法。用宣告常量的方式來替代巨集,明顯更為妥當。

//宣告一個NSTimeInterval的常量
/*
static標明在此編譯單元可見(.m檔案內),如果不宣告,編譯器會為它建立一個『外部符號』,如在別的編譯單元內有宣告同樣名稱的變數,會編譯報錯;const宣告變數值不可被修改。
*/
static const NSTimeInterval KAnimitionDuration = 0.3; 
複製程式碼

第5條:用列舉表示狀態、選項、狀態碼

//表示網路狀態的狀態列舉
typedef NS_ENUM(NSInteger,NCNetworkStatus) {
    NCNetworkStatusConnected,   //預設為0,除非指定值
    NCNetworkStatusConnecting,
    NCNetworkStatusdisConnected
};
//
NCNetworkStatus status = NCNetworkStatusdisConnected; 
switch (status) {
        case NCNetworkStatusConnected:
        { 
        }
            break;
        case NCNetworkStatusConnecting:
        { 
        }
            break;
        case NCNetworkStatusdisConnected:
        {
        }
            break;
            
        default: //這裡不要增加選項,否則當我們在列舉增加選項時而沒實現是有編譯提示的,以防我們遺忘新增選項相關的邏輯處理
            break;
    }

//選項的列舉,可使用位操作來表示選項組合
typedef NS_OPTIONS(NSUInteger, NCDirection) {
    NCDirectionNone                 = 0,
    NCDirectionUp                   = 1 << 0,
    NCDirectionDown                 = 1 << 1,
    NCDirectionLeft                 = 1 << 2,
    NCDirectionRight                = 1 << 3
};

NCDirection direction = NCDirectionUp | NCDirectionLeft; //值為5,就可以判斷為是上與左的組合選項了
複製程式碼

相關文章