Effective Objective-C chapter-1

熟悉 Objective-C

  1. Objective-C 通過一套全新的語法,在 C 語言的基礎上添加了面向對象的特性。
  2. Objective-C 使用消息結構,由 Smalltalk 語言演化而來。
  3. 消息結構和函數調用的區別在於:使用消息結構的語言,其運行時所執行的代碼由運行環境所決定;而使用函數調用的語言,則由編譯器所決定。消息結構在運行時纔回去查找所要執行的方法,編譯器也不關心接收消息的對象是何種類型,在運行期纔會去檢查對象類型,這個過程稱爲“動態綁定”。
  4. Objective-C 的重要工作都是由“運行期組件”而非編譯器來完成。使用 Objective-C 的面向對象特性所需的全部數據結構及函數都在運行期組件裏面。運行期組件本質上是一種與開發者所編寫代碼相鏈接的“動態庫”,其代碼能把開發者所編寫的所有程序粘合起來。
  5. Objective-C 的指針都是用來指示對象的,所有 Objective-C 語言的對象都必須使用指針來聲明,對象所佔的內存總是分配在“堆空間(heap space)”中,不能再棧中分配 Objective-C 對象,而對象的指針則是在棧中分配。分配在堆中的內存必須直接管理,而分配在棧上用於保存指針變量的內存會在其棧幀彈出時自動清理。
  6. Objective-C 將堆內存管理抽象了出來,不需要手動的 malloc 或者 free ,Objective-C 運行期環境將這一部分工作抽象爲一套內存管理架構,名爲“引用計數”

少引入頭文件

  1. 在頭文件中儘量使用“向前聲明” ,在實現文件中在引入對應的頭文件。將引入頭文件的實際儘量延後,只有在確有需要的時候再去引入。
  2. 如果寫的某個類繼承自某個超類,則必須引入那個超類文件。同理,如果聲明要寫的類遵從某個協議(protocol),那麼該協議也必須要有完整的定義,且不能使用向前聲明。向前聲明只能告訴編譯器有某個協議,但是此時編譯器需要知道該協議中的定義的方法。
  3. 委託協議(delegate protocol)則不需要單獨寫一個類,委託協議只有在與接受委託的類放在一起定義纔有意義,此時最好能在實現文件中聲明此類實現了該委託協議,並把這段實現代碼放在“class-continuation”分類裏。這樣的話,只需要在實現文件中引入包含委託協議的頭文件即可。否則,被外部引入的協議要單獨放在一個文件中,然後再引入。

多用字面量語法

  1. 應該是要字面量語法來創建字符串,數值,數組,字典。
  2. 應該通過取下標操作來訪問數組下標或字典中的鍵所對應的元素。
  3. 用字面量語法創建數組或字典時,若值中有 nil,則會拋出異常,務必確保值不爲 nil。

多用類型常量,少用#define 預處理命令

  1. 類型常量的命名法是:如果常量侷限於某“編譯單元(也就是實現文件)”之內,則在變量前面加上 k,如果常量在類文件之外可見,則通常以類名作爲前綴。
  2. 定義常量的位置,如果不打算公開某個常量,則應該將其定義在使用該變量的實現文件中。變量一定要同時使用 static 和 const 來聲明,static 修飾符意味着變量的編譯單元內可見,const 表示值不可變。
  3. 定義外部可見的全局常量的方法是:頭文件中的聲明方式extern NSString *const **,實現文件的定義方式 extern *const ** = @"*",這是在頭文件中聲明,在實現文件中定義。這類常量必須要定義,而且只能定義一次。

用枚舉表示狀態,選項,狀態碼

  1. 應該用枚舉來表示狀態機的狀態、傳遞給方法的選項以及狀態碼的值,給這些值取個易懂的名字。
  2. 如果把傳遞給某個方法的選項表示爲枚舉類型,而多個選項又同時可用,那麼就將各個選項的值定義爲2的冪,一遍通過按位或操作將其組合起來
  3. 使用 NS_ENUM 與 NS_OPTIONS 宏來定義枚舉類型,並指明其底層數據類型。這樣做可以確保枚舉是用開發者所選的底層數據類型實現出來的,而不會採用編譯器所選擇的類型。
  4. 在處理枚舉類型的 switch 語句中不要實現 default 分支,這樣的話,加入新的枚舉之後,編譯器就會及時提醒開發者還有沒有實現的枚舉分支。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章