標籤:

第四條:多用類型常量,少用#define預處理指令

第四條:多用類型常量,少用#define預處理指令

來自專欄 高質量iOS開發進階摸索

第四條:多用類型常量,少用#define預處理指令

編寫代碼時經常要定義常量。例如,

#Define ANIMATION_DURATION 0.3

上述預處理指令中把源代碼 ANIMATION_DURATION 字元串替換為0.3.,這樣的常量沒有類型信息,有個辦法比用預處理指令來定義常量更好。比方說,下面這這行代碼就定義了一個類型為NSTimeInterval的常量:

static const NSTimeInterval kAnimationDuration = 0.3;

用這種方式定義的常量包含類型信息,其好處是清楚地描述了常量的含義。由此可知該常量類型為 NSTimeInterval,這有助於為其編寫開發文檔。

例如:在派發通知時,為避免名稱衝突,最好是用之相關的類名做前綴。系統框架中一般都是這樣做。例如UIKit就按照這樣方式來聲明用作通知名稱的全局常量。其中有類似 UIApplicationDidEnterBackgroundNotification 和 UIApplicationWillEnterForegroundNotification 這樣的常量名。其他類型的常量也是如此。例如要把前例中動畫播放時長對外公布,那麼可以這樣聲明:

extern const NSTimeInterval MFAnimatedViewAnimationDuration = 0.3;

這樣定義常量要優於使用#define預處理指令,因為編譯器會確保常量值不變。一旦在 .m 文件中定義好,即可隨處使用。而是用預處理指令所定義的常量可能會無意中遭人修改,從而導致應用程序各個部分所適應的值互不相同。

總之,勿使用預處理指令定義常量,而應該藉助編譯器來確保常量正確,比方說可以在實現文件中用 static const 來聲明常量,也可以聲明一些全局常量。

要點

  • 不要用預處理指令定義變數。這樣定義出來的常量不含類型信息,編譯器只是會在編譯前據此執行查詢與替換操作。即使有人重新定義了常量值,編譯器也不會產生警告信息,這將導致應用程序中的常量不一致。
  • 在實現文佳年終使用static const 來定義""旨在編譯單元內可見的常量",由於此類常量不在全局符號表中,所以無須為期名稱加前綴。
  • 在頭文件中使用extern來聲明全局變數,並在相關實現文件中定義其值。這種常量要出現在全局符號中,多一其名稱應加以區隔,通常用與之相關的類名做前綴。

推薦閱讀:

「果粉」速遞:簡單9步輕鬆繞過iCloud 激活鎖
在 iOS 上手動關閉多任務中的應用對可以提升性能和節省電量嗎?
iOS 多任務任務形同虛設,為何不改進?
iOS 保持界面流暢的技巧
ios10和ios11有何區別,更新後用戶體驗如何,作為蘋果用戶相比之下是否應該更新?

TAG:iOS |