Effective Objective-C 2.0 第一章學習

1、瞭解Objective-C語言起源

一、 Objective-C使用的是「消息結構」而非「函數調用」。 Objective-C語言有Smalltalk演化而來。

兩者之間的區別
  • 使用消息語言結構的語言,其運行時所對應的代碼由運行環境決定;而使用函數調用的語言,由編譯器決定。
  • 若是調用的函數是多態的,函數調用按照「虛方法表」來查出到底應該執行哪一個函數實現;而採用消息結構的語言,不管是多態,老是在運行時纔會去查找所要執行的方法。實際上編譯器甚至不關心接受消息的對象是何種類型。接受消息的對象也要在運行時處理,這個過程叫動態綁定。
  • Objective-C的重要工做都由「運行期組件」(runtime component)而非編譯器倆完成。
總結
  • Objective-C爲C語言添加了面向對象的特性,是它的超集,Objective-C使用動態綁定的消息結構,也就說,在運行纔會檢查對象的類型。接收一條消息事後,究竟應該執行何種代碼,有運行期環境而非編譯器來決定

2、在類的頭文件中儘可能少引入其餘頭文件

  • 除非確有必要,不然不要引入頭文件。應在某各種的頭文件中使用向前聲明(@class xxx;)來說起別的類,並在實現文件中引入那些類的頭文件。這樣作能夠儘可能下降類之間的藕合。還能夠避免相互引用的問題,而且編譯時不會編譯引用的所有細節,只須要知道類名就能夠,並告訴編譯器。
  • 有事沒法使用向前聲明,好比要聲明某各種遵循一項協議。這種狀況下,儘可能把「該類遵循某協議」的這條聲明一直「class-continuation」分類中。若是不行的話,就把協議單獨放在一個頭文件中,而後將其引入。

3、多用字面量語法,少用與之等價的方法

  • 應該使用字面量語法來建立字符串、數組、字典。與建立此類對象的常規方法相比,更加簡明扼要。
  • 應該經過取下標來訪問數組下標或者字典中的鍵所對應的元素
  • 用字面量語法建立的數組或者字典,若值中有nil,則會拋出異常。所以,務必要確保值裏不含nil。而等價方法,在建立的時候,不當心用了控制對象,那麼方法就會在首個nil方法進行提早結束。

4、多用類型常亮,少用#define預處理指令

  • 不要硬預處理制定定義常量。這樣定義出來的常量不含類型信息,編譯器只是會在編譯錢據此執行查找與替換操做。即便有人從新定義了常量值,編譯器也不會產生警告信息,這樣會致使應用程序中的常量不一致
  • 在實現文件中使用static const 來定義「只在編譯單元內可見的常量」,因爲此類常量不在全局符號中,因此無需爲其名稱加前綴,如:
static const NSTimeInterval kAnimationDuration = 0.3;
複製代碼
  • 在頭文件中使用extern來聲明全局常量,並在相關實現文件中定義其值。這種常量要出如今全局符號中,因此其名稱應加以去個,一般用與之相關的類名作前綴。如: 在頭文件中
extern NSString *const EOCStringConstant;
複製代碼

在實現文件中數組

NSString *const EOCStringConstant = @"VALUE";
複製代碼

5、用枚舉表示狀態、選項、狀態碼

  • 應該用枚舉表示狀態機的狀態、傳遞給方法的選項以及狀態碼等值,給這些值起個易懂的名字。
enum EOCConnectionState {
   EOCConnectionStateDisconnected,
   EOCConnectionStateDisconnecting,
   EOCConnectionStateconnected
};
typedef enum EOCConnectionState EOCConnectionState;
複製代碼
  • 果果把傳遞給魔偶個方法的選項表示爲枚舉類型,而多個選項有可同時使用,那麼就將各選項定義爲2的冪,一邊經過按位或者操做將其結合起來。
enum UIViewAutoresizing {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
複製代碼
  • 用NS_ENUM 與 NS_OPTIONS 宏來定義枚舉類型,並指明其底層數據類型。這樣作能夠確保枚舉是用開發者所選的底層數據類型實現出來的,而不會採用編譯器所選的類型。
typedef NS_ENUM(NSUInteger, EOCConnectionState) {
    EOCConnectionStateDisconnected = 1,
    EOCConnectionStateDisconnecting,
    EOCConnectionStateconnected
};

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
}
複製代碼
  • 在處理枚舉類型的switch語句中不要實現的default分支。這樣的話,加入新枚舉以後,編譯器就會提示開發者:switch語句並無處理因此枚舉。(可是我運行發現編輯器並無警告,加了default以後)
switch (_currentState) {
        case EOCConnectionStateDisconnected:
            break;
        case EOCConnectionStateDisconnecting:
            break;
        case EOCConnectionStateconnected:
            break;
    }
複製代碼
相關文章
相關標籤/搜索