最近寫代碼,看到很多地方都用到const,決定寫一遍文章記錄一下
首先看到const,我們就想到宏,先看看宏和const的區(qū)別吧.
第一:const常量與宏的區(qū)別
1.define在預(yù)處理階段進(jìn)行替換,const常量在編譯階段使用
2.宏不做類型檢查,僅僅進(jìn)行替換,const常量有數(shù)據(jù)類型,會執(zhí)行類型檢查
3.define不能調(diào)試,const常量可以調(diào)試
4.define定義的常量在替換后運(yùn)行過程中會不斷地占用內(nèi)存,而const定義的常量存儲在數(shù)據(jù)段只有一份copy,效率更高
5.define可以定義一些簡單的函數(shù),const不可以
宏的定義
#define XMGUserDefaults [NSUserDefaults standardUserDefaults]
#define XMGNameKey @"name"
const的定義
CGFloat const a = 3;
第二:const的作用
const作用:?
?1.修飾右邊基本變量或者指針變量 int a int *p
?2.被const修飾變量只能讀,不能修改.
? int * const p;? // p:只讀? *p:變量
? ?int const * p1; // p1:變量 *p1:只讀
? ?const int * p2; // p2:變量 *p2:只讀
? ?const int * const p3; // p3:只讀 *p3:只讀
? ?int const * const p4; // p4:只讀 *p4:只讀
第三:const的使用
1.修飾全局變量 => 全局只讀變量 => 代替宏
NSString * const name = @"name";
2.修飾方法中參數(shù)
int a = 0;
[self test:&a];
- (void)test:(int const *)a
{
//? ? *a = 3;
}
第四:static和extern使用
static的使用
1.修飾局部變量,被static修飾局部變量,延長生命周期,跟整個(gè)應(yīng)用程序有關(guān)
* 被static修飾局部變量,只會分配一次內(nèi)存
* 被static修飾局部變量什么分配內(nèi)存? 程序一運(yùn)行就會給static修飾變量分配內(nèi)存
2.修飾全局變量,被static修飾全局變量,作用域會修改,只能在當(dāng)前文件下使用
extern的使用
聲明外部全局變量,注意:extern只能用于聲明,不能用于定義
extern工作原理:先會去當(dāng)前文件下查找有沒有對應(yīng)全局變量,如果沒有,才回去其他文件查找
第五: static和const聯(lián)合使用
// static和const聯(lián)合使用
// const修飾全局變量
// static修飾全局變量,修改作用域
static NSString * const name = @"name";
第六:extern和const聯(lián)合使用
// 規(guī)定:全局變量不能定義在自己類中,自己創(chuàng)建全局文件管理全局東西
XMGKIT_EXTERN NSString * const discover_name;
// 定義整個(gè)項(xiàng)目中全局變量
/***************發(fā)現(xiàn)*************/
NSString * const discover_name = @"name";