const
與宏:
1惩阶、編譯時(shí)刻:
宏是預(yù)編譯的--編譯之前處理糊探,const
是編譯階段的
2钾埂、編譯檢查:
宏不做檢查,不會(huì)報(bào)編譯錯(cuò)誤科平,只是替換褥紫。const
會(huì)編譯檢查,會(huì)編譯錯(cuò)誤瞪慧。
3髓考、宏的好處與壞處:
好處:宏能定義一些函數(shù)\方法。(const
不能)
壞處:使用大量的宏弃酌,容易造成編譯時(shí)間久绳军,每次都需要重新替換。宏并不會(huì)生成很多內(nèi)存矢腻,宏定義的是常量门驾,常量都放在常量區(qū),只會(huì)生成一份內(nèi)存多柑。
比如 str = HONG str2 = HONG
str
與str2
是同一塊內(nèi)存奶是,沒(méi)有新分配內(nèi)存。
const
僅僅用來(lái)修飾右邊的變量(包括基本數(shù)據(jù)變量p
竣灌,指針變量*p
)被const
修飾的變量是readonly
的聂沙。
eg:(const int b = 20;) == (int const b = 20;)
const
修飾的都是右邊的基本變量b
b
不能再次修改值。報(bào)錯(cuò)
(const int *p1;) == ( int const *p1;)
兩種方式一樣*p1
是常量 p1
是變量
int * const p1;
*p1
是變量 p1
是常量
(const int * const p1;) == ( int const * const p1; )
*p1
是常量 p1
是常量
需求例子:1初嘹、提供一個(gè)方法及汉,這個(gè)方法的參數(shù)是地址,里面只能通過(guò)地址讀取值,不能通過(guò)地址修改值屯烦。
test(const int *)p;
// p
地址是變量 *p
是常量不能修改值
2坷随、提供一個(gè)方法房铭,這個(gè)方法的參數(shù)是地址,里面不能修改參數(shù)的地址
test(int * const)p;
// *p
是變量温眉,p
是常量
static
與extern
:
static
修飾局部變量
1缸匪、延長(zhǎng)局部變量的生命周期,程序結(jié)束才會(huì)銷毀
2类溢、局部變量只會(huì)生成一份內(nèi)存凌蔬,只會(huì)初始化一次
3、改變局部變量的作用域
static
修飾全局變量
1闯冷、只能在本文件中訪問(wèn)砂心,修改全局變量的作用域,生命周期不會(huì)改
2蛇耀、避免重復(fù)定義全局變量
extern
作用:
只是用來(lái)獲取全局變量(包括全局靜態(tài)變量)的值辩诞,不能用于定義變量
extern
工作原理:先在當(dāng)前文件查找有沒(méi)有全局變量,沒(méi)有找到蒂窒,才會(huì)去其他文件查找躁倒。
static
與const
聯(lián)合使用:
作 用:聲明一個(gè)只讀的靜態(tài)變量
開(kāi)發(fā)使用場(chǎng)景:在一個(gè)文件中經(jīng)常使用的字符串常量荞怒,可以使用static
與const
組合洒琢。
static NSString const *key = @"name";
// *key
只讀 key
可讀可寫
extern
與const
聯(lián)合使用:
使用場(chǎng)景:在多個(gè)文件中經(jīng)常使用的同一個(gè)字符串常量,可以使用extern
與const
組合褐桌。
eg: extern NSString *const nameKey = @"name";