4、多用類型常量,少用#define預處理指令
阿新 • • 發佈:2017-06-02
報錯 作用域 生成 model 聲明 stat 指令 方法 類常量 摒棄:
#define ANIMATION_DURATION 0.3
#define ERROR_MESSAGE @“ErrorMessage”
1)沒有常量的類型信息
2)假設此指令聲明在某個頭文件中,那麽所有引入了這個頭文件的代碼,都可以訪問和修改ANIMATION_DURATION。
推薦:
1、私有常量
.m文件
static const NSTimeInterval kAnimationDuration = 0.3;
static NSString *const kErrorMessage = @“ErrorMessage”;
2、公開常量
.h文件
extern const NSTimeInterval PersonModelAnimationDuration;
extern NSString *const PersonModelErrorMessage;
.m文件
const NSTimeInterval PersonModelAnimationDuration = 0.3;
NSString *const PersonModelErrorMessage = @“ErrorMessage”;
幾點說明:
1、常量名稱的常用命名方法:若常量局限於某“編譯單元”,也就是“實現文件”之內,則在前面加字母k;若常量在類之外可見,則通常以類名為前綴。
2、在頭文件裏聲明預處理指令來定義常量,這樣做真的非常糟糕,當常量名稱有可能互相沖突時更是如此。
3、私有變量一定要同時使用static與const來聲明。如果試圖修改由const修飾符所聲明的變量,那麽編譯器就會報錯。而static修飾符則意味著該變量僅在定義此變量的編譯單元中可見。編譯器每收到一個編譯單元,就會輸出一份“目標文件(object file)”在Objective-C的語境下,“編譯單元”一詞通常指每個類的實現文件(以.m為後綴名)。因此,在上述範例代碼中聲明的kAnimationDuration變量,其作用域僅限於由PersonModel.m鎖生成的目標文件中。假如聲明此變量時不加static,則編譯器會為它創建一個“外部符號”。此時,若是另一個編譯單元中也聲明了同名變量,那麽編譯器就會拋出一條錯誤消息。
4、事實上,如果一個變量既聲明為static,又聲明為const,那麽編譯器根本不會創建符號,而是會像#define預處理指令一樣,吧所有遇到的變量都替換為常量。不過,區別是,用這種方法定義的常量是帶有類型信息的。
5、全局常量需要放在“全局符號表”中,以便可以在定義該常量的編譯單元之外還用。因此全局常量是會創建符號的。
6、extern這個關鍵字是要告訴編譯器,在全局符號表中將會有一個名為***的符號。也就是說,編譯器無須查看其定義,即允許代碼使用此常量。因為它知道,當鏈接成二進制文件之後,肯定能夠找到這個常量。因此,此類常量必須定義,而且只能定義一次。通常將其定義在與聲明該常量的頭文件相關的實現文件裏。
4、多用類型常量,少用#define預處理指令