在iOS開發(fā)中毅桃,經(jīng)常用到宏定義珍手,或用const修飾一些數(shù)據(jù)類型,經(jīng)常有開發(fā)者不知怎么正確使用双抽,導(dǎo)致項目中亂用宏與const修飾
你能區(qū)分下面的嗎百框?知道什么時候用嗎?
#define HSCoder @"漢斯哈哈哈"
NSString *HSCoder = @"漢斯哈哈哈";
extern NSString *HSCoder;
extern const NSString *HSCoder;
static const NSString *HSCoder = @"漢斯哈哈哈";
const NSString *HSCoder = @"漢斯哈哈哈";
NSString const *HSCoder = @"漢斯哈哈哈";
NSString * const HSCoder = @"漢斯哈哈哈";
當(dāng)我們想全局共用一些數(shù)據(jù)時牍汹,可以用宏铐维、變量柬泽、常量
宏:
#define HSCoder @"漢斯哈哈哈"
變量:
NSString *HSCoder = @"漢斯哈哈哈";
常量:
四種寫法:
static const NSString *HSCoder = @"漢斯哈哈哈";
const NSString *HSCoder = @"漢斯哈哈哈";
NSString const *HSCoder = @"漢斯哈哈哈";
NSString * const HSCoder = @"漢斯哈哈哈";
思考:宏與常/變量的選擇?
- 宏:只是在預(yù)處理器里進(jìn)行文本替換嫁蛇,沒有類型锨并,不做任何類型檢查,編譯器可以對相同的字符串進(jìn)行優(yōu)化睬棚。只保存一份到 .rodata 段第煮。甚至有相同后綴的字符串也可以優(yōu)化,你可以用GCC 編譯測試抑党,"Hello world" 與 "world" 兩個字符串包警,只存儲前面一個。取的時候只需要給前面和中間的地址底靠,如果是整形害晦、浮點型會有多份拷貝,但這些數(shù)寫在指令中暑中。占的只是代碼段而已壹瘟,大量用宏會導(dǎo)致二進(jìn)制文件變大
- 變量:共享一塊內(nèi)存空間,就算項目中N處用到痒芝,也不會分配N塊內(nèi)存空間俐筋,可以被修改,在編譯階段會執(zhí)行類型檢查
- 常量:共享一塊內(nèi)存空間严衬,就算項目中N處用到澄者,也不會分配N塊內(nèi)存空間,可以根據(jù)const修飾的位置設(shè)定能否修改请琳,在編譯階段會執(zhí)行類型檢查
盡量使用const粱挡,看蘋果api使用常量多點,如下圖:
常量區(qū)分
全局常量:不管你定義在任何文件夾俄精,外部都能訪問
const NSString *HSCoder = @"漢斯哈哈哈";
例如:
在ViewController定義一個 HSCoder 字符串全局常量:
在AppDelegate中訪問:
局部常量:用static修飾后询筏,不能提供外界訪問
static const NSString *HSCoder = @"漢斯哈哈哈";
例如:
在ViewController定義一個 HSCoder 字符串局部常量:
編譯時報錯:
const修飾位置不同,代表什么竖慧?
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其實沒什么區(qū)別
結(jié)論:const右邊的總不能被修改
驗證:
const int *p;
int const *p;
int * const p;
所以一般我們定義一個常量又不想被修改應(yīng)該這樣:
NSString * const HSCoder = @"漢斯哈哈哈";
測試:
在ViewController定義一個常量HSCoder:
在AppDelegate修改常量HSCoder踱讨,看下面報錯提示:
一般項目中,定義全局常量砍的,會寫在獨立文件里
HSConst.m 定義常量:
HSConst.h 提供外接訪問常量:
在AppDelegate中訪問:
文章同步到微信公眾號:hans_iOS
有疑問可以在公眾號里直接發(fā)