開(kāi)門(mén)見(jiàn)山,直入主題!
一:const
??iOS 開(kāi)發(fā)中 經(jīng)常會(huì)用到 const
關(guān)鍵字,那么我們應(yīng)該怎么理解它呢?
const
可以用來(lái)修飾基本數(shù)據(jù)類(lèi)型(int
),指針(*p
),OC對(duì)象(NSString
)等,被const
修飾的變量只會(huì)編譯一次,且被修飾的變量不能被再次修改,否則會(huì)報(bào)錯(cuò)!
舉個(gè)栗子說(shuō)明一下:
1.修飾變量
const int a = 10;
a = 1;
和
int const a = 10;
a = 1;
兩種寫(xiě)法是一樣的效果,此時(shí)const都是來(lái)修飾變量a
的;此時(shí)Xcode會(huì)這樣報(bào)錯(cuò)
2.修飾指針
- 直接修飾指針
int * const a = 10;
int *b = 20;//定義一個(gè)int型指針b,指向 20 ;
//此時(shí) *a 訪問(wèn)到的變量的值不可變; eg:
a = b;
此時(shí)Xcode會(huì)報(bào)錯(cuò)如下:
因?yàn)榇藭r(shí)
const
修飾指針a
,所以a
就不能被修改,此時(shí)*a
是可以被修改的,可以自己試一下,加深一下印象.
- 修飾指針?biāo)傅淖兞?/li>
int const *a = 10;
//此時(shí) *a 訪問(wèn)到的變量的值不可變; eg:
*a = 20;
此時(shí)Xcode會(huì)報(bào)錯(cuò)如下:
此時(shí)
const
修飾是指針?biāo)缸兞?此時(shí)指針a
其實(shí)可以修改的.
3.修飾OC對(duì)象
NSString *const name = @"xql";
name = @"new";
此時(shí)Xcode會(huì)報(bào)錯(cuò)如下:
此時(shí)
name
是不可修改的,蘋(píng)果官方代碼中也能經(jīng)乘葜埃看到這樣的用法,聲明一個(gè)只讀變量:二:宏
說(shuō)到const
,經(jīng)常拿來(lái)和宏
對(duì)比,那么它們有什么區(qū)別呢:
- 用宏定義的變量是預(yù)編譯的,即打開(kāi)工程的時(shí)候就會(huì)編譯宏代碼,過(guò)多的宏定義會(huì)加長(zhǎng)編譯時(shí)間(
用宏定義的變量也不會(huì)導(dǎo)致內(nèi)存的增加,也是只會(huì)分配一份內(nèi)存,只是增加了編譯時(shí)間!!!
),所以常用的字符變量通常用const就可以了; - 宏可以定義可定義一段代碼,const不能;
- 宏在編譯時(shí)不會(huì)檢查代碼書(shū)寫(xiě)錯(cuò)誤,const修飾變量編譯時(shí)會(huì)自動(dòng)檢查書(shū)寫(xiě)是否正確;
三:static和extern
接下來(lái)對(duì)比著看一下static
和extern
static
static
可以修飾局部變量,也可以修飾全局變量
- 1.修飾局部變量時(shí)會(huì)延長(zhǎng)局部變量的生命周期只要程序啟動(dòng)后局部變量就會(huì)一直存在,而不會(huì)在作用域結(jié)束處銷(xiāo)毀變量
舉個(gè)栗子:
?
-(void)count{
static int i = 0;
i++;
}
多次調(diào)用-count
方法,不用static修飾時(shí),i
會(huì)在count方法結(jié)束時(shí)銷(xiāo)毀從而起不到計(jì)數(shù)作用,用static修飾后i
會(huì)一直存在直到殺死程序,此時(shí)i
就能起到計(jì)數(shù)作用;因?yàn)楸?code>static修飾的變量會(huì)在程序啟動(dòng)時(shí)就分配空間(不是等到執(zhí)行方法時(shí)才分配,可自己動(dòng)手敲代碼試試
),以后程序運(yùn)行的整個(gè)周期內(nèi)就不會(huì)再分配空間了
- 修飾全局變量時(shí)會(huì)定義該全局變量的作用域只能是當(dāng)前文件夾,哪怕在別的文件內(nèi)部再用
extern
聲明也無(wú)法訪問(wèn)
- 修飾全局變量時(shí)會(huì)定義該全局變量的作用域只能是當(dāng)前文件夾,哪怕在別的文件內(nèi)部再用
extern
?extern是用來(lái)聲明全局變量的,只是聲明,而不能定義變量,即不能給聲明的變量賦值;當(dāng)在a文件內(nèi)聲明一個(gè)全局變量 int a = 3;
(默認(rèn)是帶有extern修飾符的);在沒(méi)有引用a
文件的b
文件內(nèi),只要用 extern再次聲明一下(extern int a;
)就可訪問(wèn)a
文件內(nèi)部的變量a
;且與 a文件 和 b文件 的加載順序無(wú)關(guān).