天天看點

iOS 宏(define)與常量(const)的了解

define和const

在iOS開發中經常會用到define和const。下面我們就來看看宏(define)和常量(const)的差別:

* define隻是在預編譯時進行文本替換,const是在編譯階段。

* define沒有任何的類型檢查,是以在類型錯誤的時候是不會有提示。const是有類型檢查的會有錯誤提示。

* define不僅可以定義常量,還可以定義方法。而常量(const)隻能定義常量,不能定義方法。

* const修飾具有就近性,即const後面的參數是不可變的。const修飾的參數具有隻讀性。

* 大量的define會導緻二進制檔案變大。進而導緻編譯時間變長

*編譯器通常不為普通const常量配置設定存儲空間,而是将它們儲存在符号表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀記憶體的操作,使得它的效率也很高

//注意 const是常量聲明,保證其不可修改。需要區分的是const位置不同的效果:
const NSString *text = @"abcde";  //*text指針不能修改,text可以修改。
NSString * const text = @"abc"; //*text指針可以修改,text不能修改。
           

extern

  • extern修飾的一個全局變量,多個檔案都可以通路
  • 用extern修飾的變量必須要定義,而且隻能定義一次。通常将其定義在與聲明該常量的頭檔案相關的而實作檔案裡。有實作檔案生成目标檔案時,編譯器會在資料段為字元串配置設定存儲空間
.h
extern NSString *const Test;
.m
NSString *const Test = @"www.baidu.com”;
//這樣定義常量要優于使用#define預處理指令,因為編譯器會確定常量值不變。一旦 .m 檔案中定義好了,即可随處使用,而采用預處理指令定義常量可能會無意中修改,進而導緻應用程式各個部分使用的值互不相同。