1.static
(1)修飾局部變量
用static聲明局部變量時(shí),則改變變量的存儲(chǔ)方式(生命期),使變量成為靜態(tài)的局部變量,即編譯時(shí)就為變量分配內(nèi)存,直到程序退出才釋放存儲(chǔ)單元。保證局部變量永遠(yuǎn)只初始化一次,在程序的運(yùn)行過(guò)程中永遠(yuǎn)只有一份內(nèi)存。這樣,使得該局部變量有記憶功能,可以記憶上次的數(shù)據(jù),不過(guò)由于仍是局部變量,因而只能在代碼塊內(nèi)部使用(作用域不變)。
例1:
- (void)counter{NSIntegercount =0;? ? count++;NSLog(@"count:%ld",(long)count);}//調(diào)用多次[selfcounter];? ? [selfcounter];
運(yùn)行結(jié)果如下:
截圖1.png
例2
- (void)counter{staticNSIntegercount =0;? ? count++;NSLog(@"count:%ld",(long)count);}//調(diào)用多次[selfcounter];? ? [selfcounter];
運(yùn)行結(jié)果如下:
截圖2.png
由運(yùn)行結(jié)果可知static修飾的變量只初始化了一次,并且局部變量只在當(dāng)前作用于內(nèi)可用。
(2)修飾全局變量
外部變量指在所有代碼塊{}之外定義的變量,它缺省為靜態(tài)變量,編譯時(shí)分配內(nèi)存,程序結(jié)束時(shí)釋放內(nèi)存單元。同時(shí) 其作用域很廣,整個(gè)文件都有效甚至別的文件也能引用它。為了限制某些外部變量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static 關(guān)鍵字對(duì)其作出聲明。
例3
staticNSIntegercount =0;- (void)counter1{? ? count++;NSLog(@"%ld",(long)count);? ? }- (void)counter2{? ? count++;NSLog(@"%ld",(long)count);? ? }//調(diào)用函數(shù)[selfcounter1];? ? [selfcounter2];
結(jié)果如下:
截圖3.png
例4
staticNSIntegercount =0;- (void)counter1{? ? count++;NSLog(@"%ld",(long)count);? ? }- (void)counter2{staticNSIntegercount =10;NSLog(@"%ld",(long)count);? ? }//調(diào)用函數(shù)[selfcounter1];? ? [selfcounter2];
結(jié)果如下:
截圖4.png
由例子4可知如果有全局變量和局部變量定義了同名的static 變量,那么方法體里面的實(shí)例變量和全局的static變量不會(huì)沖突,在方法體內(nèi)部訪問(wèn)的static變量和全局的static變量是不同的。
(3)修飾函數(shù)
static修飾函數(shù)時(shí),被修飾的函數(shù)被稱為靜態(tài)函數(shù),使得外部文件無(wú)法訪問(wèn)這個(gè)函數(shù),僅本文件可以訪問(wèn)。使用靜態(tài)函數(shù)的好處是,不用擔(dān)心與其他文件的同名函數(shù)產(chǎn)生干擾,另外也是對(duì)函數(shù)本身的一種保護(hù)機(jī)制。
小結(jié):用static聲明局部變量,使其變?yōu)殪o態(tài)存儲(chǔ)方式(靜態(tài)數(shù)據(jù)區(qū)),作用域不變;用static聲明外部變量,其本身就是靜態(tài)變量,這只會(huì)改變其連接方式,使其只在本文件內(nèi)部有效,而其他文件不可連接或引用該變量。
2.extern
引用關(guān)鍵字,當(dāng)某一個(gè)全局變量,沒(méi)有用static修飾時(shí),其作用域?yàn)檎麄€(gè)項(xiàng)目文件,若是在其他類想引用該變量,則用extern關(guān)鍵字,它的作用是聲明外部全局變量。這里需要特別注意extern只能聲明(并沒(méi)有分配內(nèi)存),不能用于實(shí)現(xiàn)。
在開發(fā)中,我們通常會(huì)單獨(dú)抽一個(gè)類來(lái)管理一些全局的變量或常量,下面來(lái)看看逼格比較高的一種做法:
我們可以在.h文件中extern聲明一些全局的常量
//聲明一些全局常量externNSString*constname;externNSIntegerconstcount;
然后在.m文件中去實(shí)現(xiàn)
#import //實(shí)現(xiàn)NSString*constname =@"王五";NSIntegerconstcount =3;
這樣,只要導(dǎo)入頭文件,就可以全局的使用定義的變量或常量。
extern可置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量或者函數(shù)時(shí)時(shí),在其他模塊中尋找其定義。另外,extern也可用來(lái)進(jìn)行鏈接指定
小結(jié):
1.要想訪問(wèn)全局變量可以在前面加extern
2.extern修飾的變量沒(méi)有真正內(nèi)存
Static和extern的區(qū)別:
(1)extern修飾的全局變量默認(rèn)是有外部鏈接的,作用域是整個(gè)工程,在一個(gè)文件內(nèi)定義的全局變量,在另一個(gè)文件中,通過(guò)extern全局變量的聲明,就可以使用全局變量。
(2)static修飾的全局靜態(tài)變量,作用域是聲明此變量所在的文件。
參考
objective-c static變量的使用總結(jié)
iOS開發(fā)中Static和Const關(guān)鍵字的的作用
iOS開發(fā)中的關(guān)鍵字const/static/extern
作者:iOS俱哥
鏈接:http://www.lxweimin.com/p/8fdbd1b1ddf3
來(lái)源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。