本節書摘來自華章出版社《編寫高品質代碼:改善objective-c程式的61個建議》一 書中的第1章,第1.3節,作者:劉一道,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
<code>#define</code>定義了一個宏,在編譯開始之前就會被替換。const隻是對變量進行修飾,當試圖去修改該變量時,編譯器會報錯。在一些場合裡你隻能用 #define,而不能用 const。理論上來說,const 不僅在運作時需要占用空間,而且還需要一個記憶體的引用;但從時間上來說,這是無關緊要的,編譯器可能會對其進行優化。
const在編譯和調試的時候比 #define 更友好。在大多數情況下,當你決定用哪一個時,這是你應該考慮的一個非常重要的點。
想象一下,下面這樣一個應該使用 #define 而不是 const 的場景:如果想在大量的 .c 檔案中使用一個常量,隻需要使用 #define 放在頭檔案中;而使用 const,則需要在 .c 檔案和頭檔案中都進行定義,如下所示。
my_int_const ,在任何 c 檔案中都不能當作一個靜态變量或全局作用域使用,除非它已被定義。然而,對于一個整型常量,你可以使用枚舉(enum)。事實上,這就是 apple一直在做的事情。它(enum)兼有 #define 和 const 的所有優點,但是隻能用在整型常量上。
哪一個更高效或更安全呢?#define 在理論上來說更高效,但就像之前說的那樣,在現代的編譯器上,它們可能沒什麼不同。#define 會更安全,因為當試圖指派給它時,總會出現一個編譯器錯誤。
是以,相對字元串字面量或數字,更推薦适用常量。應使用static方式聲明常量,而非使用#define的方式來定義宏。
恰當用法如下所示:
不當用法如下所示:
對于整型類型,代替#define比較好的方法是使用enum,在使用enum時,推薦使用最新的fixed underlying type規範的ns_enum和ns_options宏,因為它們是基于c語言的枚舉,保留了c語言的簡潔和簡單的特色。這些宏能明确指定枚舉類型、大小和選項,改善在xcode中的代碼品質。此外,在舊的編譯器中,這種文法聲明能正确編譯通過,在新的編譯器中也可明解基礎類型的類型資訊。
下面,使用ns_enum宏定義枚舉。該組值是互斥的,代碼如下:
在本例中,在命名uitableviewcellstyle的nsinteger類型時,通過使用ns_enum宏使界定雙方的名稱和枚舉類型更容易了。
在下面的代碼中,通過使用ns_options宏定義了一組可以組合在一起的位掩碼值,實作方式如下:
像枚舉一樣,ns_options宏定義了一個名稱和一個類型。然而,對于選項的類型通常應該是nsuinteger 。
在實際編碼中,如何使用枚舉宏來更換enum,比如這樣一個enum定義:
在實際開發中,經常會使用enum來定義一個位掩碼,如下面一個用enum來定義位掩碼的示例:
對于上面的通過用enum定義位掩碼的示例,可使用ns_options宏實作如下:
或者,也可以使用現代化的objective-c的轉換器在xcode自動進行此更改。
