?多用類型常量, 少用 #define 預處理指令
#define 預處理指令會把碰到的所有 指定名稱 一律換位 定義的內容, 這樣的話, 假設此指令在某個頭文件中, 那么所有引入這個頭文件的代碼, 都會被替換
解決這個問題, 有一個辦法
static const NSString * name = @"name";
請注意,用此方式定義的常量包含類型信息, 器好處是清除地描述了常量的含義,?
還要注意常量名稱, 常量命名的方法是: 若常量局限于 "編譯單元", 也就是實現(xiàn)文件, 即 .m 文件里面, 則在前面加字幕 k. 若常量在類之外可見, 則通常以類名為前綴
定義常量的位置很重要, 我們總習慣在頭文件里聲明 預處理指令, 這樣所有引入這份頭文件的其他文件都會出現(xiàn)這個 預處理指令, 就是用static const 定義的常量也不應該出現(xiàn)在頭文件中,
正確的做法是, 若不打算公開某個常量, 則應該將其定義在使用該常量的實現(xiàn)文件里面, ?在 @implemantation xxxxxxxx 上方寫.
而用 static 修飾符則意味著該白能量僅在定義變量的編譯單元中可見, 加入聲明次變量時不加 static ,此時若是另一個編譯單元中也聲明了 同名變量, 編輯器就會報錯
有時候需要對外公開某個常量, 應該這樣來定義
在 頭文件中,即 .h 文件
extern NSString*const XXXXXX;
在 實現(xiàn)文件中, 即 ?.m 文件
NSString *const XXXXXX = @"xxxxxx";
這個常量在頭文件中 聲明, 且在實現(xiàn)文件中定義,?
//這樣定義常量要由于使用 #define 預處理指令, 因為編譯器會確保常量值不變,?
總結 :?
不要用預處理指令定義吃那個兩, 這樣定義出來的常量不包含類型信息, 編譯器只是在編譯前據(jù)此執(zhí)行查找與替換操作, 即使有人沖洗定義了常量值, 編譯器也不會產生警告信息,這將導致應用程序的常量值不一致.
在實現(xiàn)文件中使用 static const 來定義 只在編譯單元可見的常量 , 由于此類常量不在全局單元符號表中, 所以無需為其名稱加前綴
在頭文件中使用 extern 來聲明全局變量, 并在相關實現(xiàn)文件中定義其值, 這種常量要出現(xiàn)在全局符號表中, 所以其名稱應加區(qū)隔, 通常用用戶只相關的類名做前綴