對(duì)于剛接觸iOS開發(fā)的程序員來說, 對(duì)于宏和常量的使用都并不是很了解, 所以在項(xiàng)目中胡亂的用宏和const修飾,今天我就以宏和常量整理出一篇文章,讓大家對(duì)宏和常量的理解和使用更加清晰一些。
如果你能分清下面的代碼的區(qū)別,和使用,那么對(duì)于宏和常量的理解就已經(jīng)很到位了。
#define XYName @"理清思路......"
NSString *XYName = @"理清思路......";
extern NSString *XYName;
extern const NSString *XYName;
static const NSString *XYName = @"理清思路.....";
const NSString *XYName = @"理清思路.....";
NSString const *XYName = @"理清思路.....";
NSString *const XYName = @"理清思路.....";
當(dāng)我們想要全局通用一些數(shù)據(jù)時(shí), 我們就可以使用宏,變量,常量。下面說一下他們的區(qū)別。
首先是宏:
只是在預(yù)處理器里進(jìn)行文本替換,沒有類型,不做任何類型檢查,編譯器可以對(duì)相同的字符串進(jìn)行優(yōu)化。只保存一份到 .rodata 段。甚至有相同后綴的字符串也可以優(yōu)化,你可以用GCC 編譯測(cè)試,"Hello world" 與 "world" 兩個(gè)字符串,只存儲(chǔ)前面一個(gè)。取的時(shí)候只需要給前面和中間的地址,如果是整形、浮點(diǎn)型會(huì)有多份拷貝,但這些數(shù)寫在指令中。占的只是代碼段而已,大量用宏會(huì)導(dǎo)致二進(jìn)制文件變大
變量:
共享一塊內(nèi)存空間,就算項(xiàng)目中N處用到,也不會(huì)分配N塊內(nèi)存空間,可以被修改,在編譯階段會(huì)執(zhí)行類型檢查。
常量:
共享一塊內(nèi)存空間,就算項(xiàng)目中N處用到,也不會(huì)分配N塊內(nèi)存空間,可以根據(jù)const修飾的位置設(shè)定能否修改,在編譯階段會(huì)執(zhí)行類型檢查。
這些解釋是我在看資料的時(shí)候看別人寫的,寫的很好,所以就直接拿過來用了,這些解釋應(yīng)該對(duì)大家的理解有所幫助,蘋果的API使用const很多,所以多使用const。
常量的區(qū)分:
全局常量:無論你定義在哪個(gè)文件夾里,外部都可以訪問的到。
NSString const *XYName = @"理清思路.....";
局部常量:用static修飾的為局部常量,修飾之后不提供外界訪問。
static const NSString *XYName = @"理清思路.....";
那么const修飾的位置不同,又有什么區(qū)別呢?
1. const NSString *XYName = @"理清思路.....";
2. NSString const *XYName = @"理清思路.....";
3. NSString *const XYName = @"理清思路.....";
1. const NSString *XYName = @"理清思路.....";
*XYName 不能被修改 XYName可以被修改
2. NSString const *XYName = @"理清思路.....";
*XYName 不能被修改 XYName可以被修改
3. NSString *const XYName = @"理清思路.....";
*XYName可以被修改 XYName不能被修改
1、2沒有什么區(qū)別
對(duì)于這敘述修飾位置的區(qū)別,大家可以自己用代碼驗(yàn)證一下。可以幫助自己加深理解。