編寫高質量代碼-OC 第1章 讓本身習慣OC

一、視Objective-C爲一門動態語言
雖然OC和C++都是在C的基礎上加入面向對象特性擴充而成的程序設計語言,OC基於動態運行時類型,而C++基於靜態類型。OC編寫的程序不能直接編譯成可以使機器語言(二進制編碼),而是在程序運行時,經過運行時(Runtime)把程序轉譯成可令機器讀懂的機器語言。數組

  • Objective-C是動態語言,C++是靜態語言
  • 靜態語言執行效率和安全性要比動態語言高,但其簡便性沒有動態語言高
  • 運行時(Runtime)環境可處理弱類型、函數存在檢查工做,會檢測註冊列表裏是否存在對應的函數,類型是否正確,最後肯定正確的函數地址,再進行保存寄存器狀態、壓棧、函數調用等實際操做,確保了objective-C的靈活性。

二、在頭文件中儘可能減小其餘頭文件的使用安全

  • 在頭文件(.h)中,關鍵字「@class」,只是爲了在頭文件中引用這個類,把這個類做爲一個類型來用,這就要求引用的頭文件(.h)名與類的名稱同樣
  • 在頭文件(.h)中使用「@class」,在源文件中使用「#import」,不但能夠減小沒必要要的編譯時間,下降類之間的耦合度,並且還能夠避免循環引用。
  • 在設計類時,儘可能多采用協議,避免#import過多,引用沒必要要的部分。
  • 若是頭文件(.h)中有多個類的定義,儘可能採用模塊方式,只針對性引進所須要的類。

三、儘可能使用const、enum來替換預處理#define框架

  • 儘可能避免使用#define預處理命令。#define預處理命令不包含任何的類型信息,僅僅是在編譯前作替換操做。它們在重複定義時不會發出警告,容易在整個程序中產生不一致的值。
  • 在源文件(.m)中定義的static const類型常量由於無須全局引用,因此它們的名字不須要包含命名空間。
  • 在頭文件(.h)中定義的全局引用的常量,須要關聯定義在源文件(.m)中的部分。由於須要被所有引用,因此它們的名字須要包含命名空間,一般是用他們的類名做爲命名前綴。
  • 儘可能用NS_ENUM和NS_OPTIONS宏來實現枚舉。

四、優先使用對象字面量語法而非等效方法函數

  • 儘可能使用對象字面量語法來建立字符串、數字、數組和字典,比常規對象建立方法語法更爲簡明
  • 徹底向下兼容
  • 在數字和字典中,要使用關鍵字和索引作下標來獲取數據
  • 使用對象字面量語法時,容器類的不可以使nil,不然運行時將會拋出異常。

五、處理隱藏的返回類型,優先選擇實例類型(instancetype)而非id編碼

  • instancetype僅用於返回類型
  • 使用instancetype可避免隱式轉換id而形成的欺騙性編譯無誤經過的現象,防止程序正式運行時出現崩潰現象,提升安全性
  • 在某一個特定區域,能夠替代id,並不是全部區域均可以替代id

六、儘可能使用模塊方法與多類創建複合關係設計

  • #include和#import,其根本就是簡單的複製、粘貼,將目標.h文件中內容一字不落的複製到當前文件中,後者能夠避免屢次的重複引用
  • 以預編譯頭文件的方式,雖可縮短編譯時間,但其維護棘手,不利於普遍應用。
  • 模塊功能,其應用不只僅表現於編譯的速度加快,同時在鏈接框架等方面也很是好用
  • 啓動模塊功能後,編譯器會隱式地把全部的#import都轉換成@import

七、明解Objective-C++中的有所爲而有所不爲對象

  • C++和Objective-C在定義結構上同樣,可是後者的繼承是封閉的
  • Objective-C接口中定義的C++類是全局範圍,而不是Objective-C類的內嵌類
  • C++和Objective-C的對象模型不能直接兼容,與Objective-C不一樣的是,C++對象是靜態類型的,有運行時系統多態是特殊狀況
  • C++和Objective-C有詞彙歧義和衝突
  • C++和Objective-C二者功能上有限,Objective C++沒有爲Objective-C類增長C++的功能,也沒有爲C++類增長Objective-C的功能
相關文章
相關標籤/搜索