在iOS開發中,常常用到宏定義,或用const修飾一些數據類型,常常有開發者不知怎麼正確使用,致使項目中亂用宏與const修飾api
你能區分下面的嗎?知道何時用嗎?測試
#define HSCoder @"漢斯哈哈哈" NSString *HSCoder = @"漢斯哈哈哈"; extern NSString *HSCoder; extern const NSString *HSCoder; static const NSString *HSCoder = @"漢斯哈哈哈"; const NSString *HSCoder = @"漢斯哈哈哈"; NSString const *HSCoder = @"漢斯哈哈哈"; NSString * const HSCoder = @"漢斯哈哈哈";
宏:優化
#define HSCoder @"漢斯哈哈哈"
變量:spa
NSString *HSCoder = @"漢斯哈哈哈";
常量:code
四種寫法: static const NSString *HSCoder = @"漢斯哈哈哈"; const NSString *HSCoder = @"漢斯哈哈哈"; NSString const *HSCoder = @"漢斯哈哈哈"; NSString * const HSCoder = @"漢斯哈哈哈";
思考:宏與常/變量的選擇?圖片
儘可能使用const,看蘋果api使用常量多點,以下圖:內存
這裏寫圖片描述開發
全局常量:無論你定義在任何文件夾,外部都能訪問字符串
const NSString *HSCoder = @"漢斯哈哈哈";
例如:編譯器
在ViewController定義一個 HSCoder 字符串全局常量:
這裏寫圖片描述
在AppDelegate中訪問:
這裏寫圖片描述
局部常量:用static修飾後,不能提供外界訪問
static const NSString *HSCoder = @"漢斯哈哈哈";
例如:
在ViewController定義一個 HSCoder 字符串局部常量:
這裏寫圖片描述
編譯時報錯:
這裏寫圖片描述
1.const NSString *HSCoder = @"漢斯哈哈哈"; 2.NSString const *HSCoder = @"漢斯哈哈哈"; 3.NSString * const HSCoder = @"漢斯哈哈哈";
1.const NSString *HSCoder = @"漢斯哈哈哈"; "*HSCoder"不能被修改, "HSCoder"能被修改 2.NSString const *HSCoder = @"漢斯哈哈哈"; "*HSCoder"不能被修改, "HSCoder"能被修改 3.NSString * const HSCoder = @"漢斯哈哈哈"; "HSCoder"不能被修改,"*HSCoder"能被修改 注意:1和2其實沒什麼區別
結論:const右邊的總不能被修改
驗證:
const int *p;
這裏寫圖片描述
int const *p;
這裏寫圖片描述
int * const p;
這裏寫圖片描述
因此通常咱們定義一個常量又不想被修改應該這樣:
NSString * const HSCoder = @"漢斯哈哈哈";
測試:
在ViewController定義一個常量HSCoder:
這裏寫圖片描述
在AppDelegate修改常量HSCoder,看下面報錯提示:
這裏寫圖片描述
通常項目中,定義全局常量,會寫在獨立文件裏
HSConst.m 定義常量:
這裏寫圖片描述
HSConst.h 提供外接訪問常量:
這裏寫圖片描述
在AppDelegate中訪問:
文/漢斯哈哈哈(簡書做者) 原文連接:http://www.jianshu.com/p/f83335e036b5 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。