iOS中static和extern關(guān)鍵字

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ā)static關(guān)鍵字的理解

iOS開發(fā)中的關(guān)鍵字const/static/extern

iOS中的extern與static

作者:iOS俱哥

鏈接:http://www.lxweimin.com/p/8fdbd1b1ddf3

來(lái)源:簡(jiǎn)書

簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.static (1)修飾局部變量 用static聲明局部變量時(shí),則改變變量的存儲(chǔ)方式(生命期),使變量成為靜態(tài)...
    iOS俱哥閱讀 657評(píng)論 0 4
  • 1 原理 1.1 首先,關(guān)于聲明和定義的區(qū)別。 這種寫法(函數(shù)原型后加;號(hào)表示結(jié)束的寫法)只能叫函數(shù)聲明而不能叫函...
    Pitfalls閱讀 6,576評(píng)論 2 12
  • “ 想要得到某種東西的最好辦法,就是讓自己配得上他。”______ 查理.芒格
    岳太林閱讀 138評(píng)論 0 0
  • 最全面的英語(yǔ)口語(yǔ)練習(xí)方式就是要不斷的跟讀,不斷的背誦,跟讀——模仿——朗讀——背誦——聽寫。 ①讀一句,然后按暫停...
    蒙娜麗莎頭頭閱讀 204評(píng)論 0 0
  • 直到今天一早出門的時(shí)候我還在考慮要不要去昨天剛剛面試的地方去看一看,當(dāng)我再次看到昨天馬伯伯的一個(gè)消息的時(shí)候...
    憨人崔閱讀 172評(píng)論 0 0