編寫代碼的時候我們經(jīng)常需要定義常量,而當(dāng)某一個常量會多次用到的時候最科學(xué)的辦法是將它提取出來,方便日后的維護(hù)和增強(qiáng)代碼的可讀性。
也許我們會這么做:
#define TABLEVIEW_HEIGHT 600
#define TABLEVIEW_WIDTH 600
這樣做的好處是寫起來快、方便。我們通常叫#define指令為預(yù)處理指令,預(yù)處理過程會將項目中所有引入該頭文件的TABLEVIEW_HEIGHT替換成600。所以要想更好的處理這個問題,我通常采用下面的方法:
static const CGFloat kTableviewHeight = 600.0;
采用這種方法比起預(yù)處理指令有2個好處。
- 更加清楚描述了常量的含義,一看便知常量的類型為
CGFloat - 按照命名習(xí)慣(naming convention)在編譯單元即
.m文件內(nèi),常量上加字母k,若需要在多個文件可見則通常加上類名為前綴。
在適當(dāng)?shù)牡胤蕉x常量位置也是一種很不錯的代碼風(fēng)格。在頭文件里聲明#define指令這種做法很可能會導(dǎo)致名稱互相沖突,而且會隨著項目代碼量增多會越來越不好管理。同時,在Object-C種沒有“namespace”的概念,所以在頭文件內(nèi)的TABLEVIEW_HEIGHT相當(dāng)于聲明了一個全局變量。所以我們通常采用static const的方法在.m文件中聲明常量。在OC中若變量同時用static和const修飾,編譯器會將它所遇到的變量替換成常量值。
有時候我們還需要公開某個常量,例如NSNotificationCenter的通知name,接收者需要知道這個name。這時候我們通常會定義一個"global symbol table",這個定義方式與 static const方式有所不同:
//.h文件 MJRefresh源碼中喜歡使用 UIKIT_EXTERN
extern NSString *const MKDidLoginnotification;
//.m文件
NSString *const MKDidLoginnotification = @"MKDidLoginnotification";
這里可以這么理解:MKDidLoginnotification是一個常量,這個常量的本質(zhì)其實是一個指針(即指針常量),指向了一個NSString對象。