const修飾全局變量取代宏定義
宏定義
C系程序中廣泛使用宏定義,宏只是一種簡單的字符串替換摘符,根據(jù)是否帶參數(shù)分為無參和帶參
// 寬高
#define kWBCellTopMargin 8 // cell 頂部灰色留白
#define kWBCellTitleHeight 36 // cell 標題高度 (例如"僅自己可見")
#define kWBCellPadding 12 // cell 內(nèi)邊距
#define kWBCellPaddingText 10 // cell 文本與其他元素間留白
#define kWBCellPaddingPic 4 // cell 多張圖片中間留白
#define kWBCellProfileHeight 56 // cell 名片高度
#define kWBCellCardHeight 70 // cell card 視圖高度
#define kWBCellNamePaddingLeft 14 // cell 名字和 avatar 之間留白
#define kWBCellContentWidth (kScreenWidth - 2 * kWBCellPadding) // cell 內(nèi)容寬度
#define kWBCellNameWidth (kScreenWidth - 110) // cell 名字最寬限制
開發(fā)中可能用這么一大堆的宏定義來記錄某段間距, 某個視圖的高度, 或者某段字符串等, 宏定義可以簡單的理解為一個常量
宏的優(yōu)點
這樣做的目的在于用一個比較清楚的名稱記錄某個常量, 集中在某個區(qū)域管理這些常量, 在以后方便修改,修改一處便可以修改全局
宏的缺點
但是如果一份代碼中有多處需要訪問某個宏的值, 這種方法就變得不可行
你可能會想到將這些宏定義放入.pch文件內(nèi),這樣不就可以辦到全局訪問了, 但是這樣會使.pch文件內(nèi)部變得十分臃腫
你可能又會想到將這些宏定義在一個頭文件內(nèi), 然后再將這個頭文件導入到.pch文件內(nèi), 這樣就可以辦到全局訪問了, 但是這樣仍然存在問題
比如我的一份代碼內(nèi)有10處用到kWBCellTopMargin這個宏, 每次用到這個宏, 系統(tǒng)相當于需要分配一塊臨時內(nèi)存給這個宏, 這樣累計多了, 會比較浪費
const修飾的全局變量
比較好的做法應該是使用"全局常量", 類似于這種形式
- const CGFloat AYAlpha = 0.5;
- const NSString *AYName = @"陳洋";
為了保證這個變量不被其他地方修改,做到只讀, 使用const修飾,變量也就變?yōu)榱顺A?/p>
const全局變量的優(yōu)勢
- 這樣也保證了常量在創(chuàng)建的時候, 開辟一塊內(nèi)存, 而全局的其他地方, 只是訪問它, 不會開辟臨時內(nèi)存
- 完全可以代替宏的作用
建議做法
為了集中管理, 分清業(yè)務邏輯, 可以在工程內(nèi)單獨建立一個文件管理這些"全局常量"
一般情況, 我會在工程內(nèi)搞一個名為AYConst的.h和.m文件, 注意這兩個文件并不是構成一個類, 并不具備類的入口, 這樣命名只是為了層次清楚
.m文件 (保存全局常量)
#import <UIKit/UIKit.h>
const CGFloat AYCellTopMargin = 8.0;
const CGFloat AYCellLeftMargin = 0.6;
const CGFloat AYCellRightMargin = 0.7;
const CGFloat AYAlpha = 1.0;
NSString * const AYName = @"jack";
.h文件(此文件導入到.pch文件, 讓每個文件都可以引用)
#import <UIKit/UIKit.h>
UIKIT_EXTERN const CGFloat AYCellTopMargin;
UIKIT_EXTERN const CGFloat AYCellLeftMargin;
UIKIT_EXTERN const CGFloat AYCellRightMargin;
UIKIT_EXTERN const CGFloat AYAlpha;
UIKIT_EXTERN NSString * const AYName;
我會根據(jù)需求,將.h導入合適的位置物喷,對應使用的類也會引用到存在于.m文件中的這些全局常量
關于UIKIT_EXTERN關鍵字
UIKIT_EXTERN關鍵字是OC中蘋果推薦的引用外部變量的關鍵字, 實際就是extern關鍵字的OC優(yōu)化,作用和extern一致,引用外部變量需要的關鍵字
補充知識
關于const關鍵字的位置問題
- const NSString *p;
- NSString const *p;
- NSString *const p;
判斷準則: 看const右側(cè)修飾的變量是誰
- 前兩個都是修飾的*p,也就是指針指向的變量是"readOnly"的,指針p是可以指向其他內(nèi)存空間的,前兩種寫法一致
- 最后一個修飾的是p,也就是指針p不能再指向其他內(nèi)存空間, 但是p指向的變量卻是可以改變的