編寫高質量iOS與OS X代碼的52個有效方法
第1章 熟悉Objective-C
1.了解Objective-C 語言的起源
Objective-C使用消息結構messaging structure,而非函數調用function calling。
消息結構:運行時所運行的代碼是由運行環境決定的。運行時才會去查找所要執行的方法。
函數調用:編譯器決定。
Objective-C是C語言的超集,使用動態綁定的消息結構,在運行時才會檢查對象類型。接收到一條消息后,究竟該執行何種代碼,由運行時環境而非編譯器決定。
對象所占內存總是分配在堆上。
要點
- Objective-C 為C語言添加了面向對象特性,是其超集。Objective-C 使用動態綁定的消息結構,也就是說,在運行時才會檢查對象類型。接受一條消息之后,究竟應執行何種代碼,由運行期環境而非編譯器來決定。
- 理解C語言的核心概念有助于寫好Objective-C程序。尤其要掌握內存模型與指針。
2.在類的頭文件中盡量少引入其他頭文件
@class的作用:
(1)可以將引入頭文件的時機延后,只在確實有需要的時候才引入,可以減少類的使用者所需引入的頭文件數量,減少編譯時間。
(2)解決兩個類相互引用的問題。相互引用會導致循環引用,兩個類里有一個無法被正確編譯。
要點
- 除非確有必要,否則不要引入頭文件。一般來說,應在某個類的頭文件中使用向前聲明來提及別的類,并在實現文件中引入那些類的頭文件。這樣做可以盡量降低類之間的耦合(coupling)。
- 有時無法使用向前聲明,比如要聲明某個類遵循一項協議。這種情況下,盡量把“該類遵循某協議”的這條聲明移至“class-continuation分類”中。如果不行的話,就把協議單獨放在一個頭文件中,然后將其引入。
3.多用字面量語法,少用與之等價的方法
字面量語法簡明扼要。
創建數組或字典時使用字面量語法能夠盡早發現插入nil的問題。
要點
- 應該使用字面量語法來創建字符串、數值、數組、字典。與創建此類對象的常規方法相比,這么做更加簡明扼要。
- 應該通過取下標操作來訪問數組下標或字典中的鍵所對應的元素。
- 用字面量語法創建數組或字典時,若值中有nil,則會拋出異常。因此,務必確保值里不含nil。
4.多用類型常量,少用#define預處理命令
- 不要使用預處理指令定義常量。(1)這樣定義出來的常量不含類型信息,編譯器只是會在編譯前據此執行查找與替換操作。(2)如果被其他人重新定義了常量值,編譯器不會報警告,這將導致常量值不一致。
- 在實現文件里使用static const來定義此類中使用的常量。由于此類常量不在全局符號表中,所以無須為其名稱加前綴。
- 在頭文件中使用extern來聲明全局變量,并在實現文件中定義其值。這種常量會出現在全局符號表中,所以名稱最好加上與之相關的類名做前綴。
5.用枚舉表示狀態、選項、狀態碼
要點
- 應該用枚舉來表示狀態機的狀態、傳遞給方法的選項以及狀態碼等值,給這些值起個易懂的名字。
- 如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用,那么就將個選項值定義為2的冪,以便通過按位或操作將其組合起來。
- 用NS_ENUM與NS_OPTIONS宏來定義枚舉類型,并指明其底層數據結構。這樣做可以確保枚舉類型是用開發者所選的底層數據結構實現出來的,而不會采用編譯器所選的類型。
- 在處理枚舉類型的switch語句中不要實現default分支。這樣的話,加入新枚舉之后,編譯器就會提示開發者:switch語句并未處理所有枚舉。