iOS 關(guān)鍵字const/static/extern

一痛垛、前言

閱讀別人的代碼(一些優(yōu)秀的源碼)總能發(fā)現(xiàn)一些常見的關(guān)鍵字舅逸,隨著編程經(jīng)驗(yàn)的積累大部分還是知道是什么意思的刽严,但在概念上和具體的用法上卻依然有些模糊蹬碧,故特意整理匯總了下三個(gè)比較常見的關(guān)鍵字——const/static/extern舱禽。

二、關(guān)鍵字const/static/extern的釋義和用法

1恩沽、const

這個(gè)單詞翻譯成中文是“常量”的意思誊稚。在程序中我們知道“常量”的值是不能變的,固定的罗心。所以const關(guān)鍵字的作用就呼之欲出了:

(1)const用來(lái)修飾右邊的基本變量或指針變量

(2)被修飾的變量只讀片吊,不能被修改

下面舉個(gè)最簡(jiǎn)單的例子:

//聲明一個(gè)int類型的變量a,變量初始化值為10协屡,并且變量a左邊有一個(gè)const關(guān)鍵字修飾

int??const??a?=?10;

//因?yàn)樽兞縜被const修飾俏脊,就成為了只讀,不能被修改賦值了肤晓,所以下面這行代碼是錯(cuò)誤的

a?=?20;

//錯(cuò)誤代碼

//上面第一句代碼和這句代碼是等價(jià)的爷贫,都是修飾變量a讓其只讀

const??int???a?=?10;

下面再看一組練習(xí)认然,這組練習(xí)完成后,相信你就完全理解const的用法:

分別指出下面四行代碼中 *p 和p是只讀還是變量

int??const??*p???//??*p只讀?;p變量

int??*?const??p??//?*p變量?;?p只讀

const??int???*?const?p?//p和*p都只讀

int??const??*?const??p???//p和*p都只讀

注: 判斷p 和p是只讀還是變量漫萄,關(guān)鍵是看const在誰(shuí)前面卷员。如果只在p前面,那么p只讀腾务,p還是變量毕骡;如果在p前面,那么p只讀 ,p變量岩瘦。

const的常用用法:

//定義一個(gè)全局只讀變量

NSString??*?const?Kname?=?@"appkey";

//static修飾后此全局變量只能本文件訪問(wèn)

static?NSString?*const?Key?=?@"hddjj”;

2未巫、static

這個(gè)單詞翻譯成中文是“靜態(tài)”的意思。關(guān)從字面上理解還真沒法跟他的作用關(guān)聯(lián)起來(lái)启昧,下面我們直接先看他的作用:

(1)修飾局部變量

保證局部變量永遠(yuǎn)只初始化一次叙凡,在程序的運(yùn)行過(guò)程中永遠(yuǎn)只有一份內(nèi)存, ?生命周期類似全局變量了密末,但是作用域不變握爷。這句話怎么理解呢?還是以代碼例子來(lái)講解吧严里。

隨便建一個(gè)工程新啼,在一個(gè)控制器類上監(jiān)聽控制器view的點(diǎn)擊事件方法:

-(void)touchesBegan:(NSSet?*)touches?withEvent:(UIEvent?*)event

{????//聲明一個(gè)局部變量i

int?i?=?0;????//每次點(diǎn)擊view來(lái)到這個(gè)方法時(shí)讓i自增

i?++;????//打印結(jié)果

NSLog(@"i=%d",i);

}

輸出日志如下:

2016-10-26?14:58:48.290?fff[2760:170260]?i=1

2016-10-26?14:58:49.044?fff[2760:170260]?i=1

2016-10-26?14:58:49.200?fff[2760:170260]?i=1....

從輸出日志中我們可以看到i一直等于1,這也是預(yù)料之中的刹碾,因?yàn)槊看吸c(diǎn)擊進(jìn)入這個(gè)方法就會(huì)重新初始化一個(gè)全新的變量i= 0燥撞,加加了一次后值變?yōu)?,然后打印出結(jié)果為1教硫,出了這個(gè)方法后局部變量i就被釋放回收。所以每次打印出來(lái)的結(jié)果都為1辆布。

但是我們?cè)倏纯淳植孔兞?b>i被關(guān)鍵字static修飾后的情況:

-(void)touchesBegan:(NSSet?*)touches?withEvent:(UIEvent?*)event

{????//聲明一個(gè)局部變量i

static??int?i?=?0;????//每次點(diǎn)擊view來(lái)到這個(gè)方法時(shí)讓i自增

i?++;????//打印結(jié)果

NSLog(@"i=%d",i);

}

輸出日志如下:

2016-10-26?15:07:34.276?fff[2817:175155]?i=1

2016-10-26?15:07:35.347?fff[2817:175155]?i=2

2016-10-26?15:07:35.761?fff[2817:175155]?i=3

2016-10-26?15:07:36.057?fff[2817:175155]?i=4

2016-10-26?15:07:36.415?fff[2817:175155]?i=5....

上面日志中可以看到i的值一直在自增瞬矩。什么,它不是每次進(jìn)去都被初始化賦值為0了么锋玲,怎么能累加呢景用。這就是關(guān)鍵字static修飾的局部變量的作用,讓局部變量永遠(yuǎn)只初始化一次惭蹂,一份內(nèi)存伞插,生命周期已經(jīng)跟全局變量類似了,只是作用域不變盾碗。

(2)修飾全局變量

使全局變量的作用域僅限于當(dāng)前文件內(nèi)部媚污,即當(dāng)前文件內(nèi)部才能訪問(wèn)該全局變量。

iOS中在一個(gè)文件聲明的全局變量廷雅,工程的其他文件也是能訪問(wèn)的耗美,但是我又不想讓其他文件訪問(wèn)京髓,這時(shí)就可以用static修飾它了,比較典型的是使用GCD一次性函數(shù)創(chuàng)建的單例商架,全局變量基本上都會(huì)用static修飾堰怨。

下面是一個(gè)GCD一次函數(shù)創(chuàng)建的單利

@implementation?LoginTool

//static修飾全局變量,讓外界文件無(wú)法訪問(wèn)

static?LoginTool?*_sharedManager?=?nil;

+?(LoginTool?*)sharedManager?{

static?dispatch_once_t?oncePredicate;

dispatch_once(&oncePredicate,?^{

_sharedManager?=?[[self?alloc]?init];

});

return?_sharedManager;

}

(3)修飾函數(shù)

static修飾函數(shù)時(shí)蛇摸,被修飾的函數(shù)被稱為靜態(tài)函數(shù)备图,使得外部文件無(wú)法訪問(wèn)這個(gè)函數(shù),僅本文件可以訪問(wèn)赶袄。這個(gè)在oc語(yǔ)言開發(fā)中幾乎很少用揽涮,c語(yǔ)言倒是能看到一些影子,所以不詳細(xì)探討弃鸦。

3绞吁、extern

這個(gè)單詞翻譯過(guò)來(lái)是“外面的、外部的”唬格。顧名思義家破,它的作用是聲明外部全局變量。這里需要特別注意extern只能聲明购岗,不能用于實(shí)現(xiàn)汰聋。

在開發(fā)中,我們通常會(huì)單獨(dú)抽一個(gè)類來(lái)管理一些全局的變量或常量喊积,下面來(lái)看看逼格比較高的一種做法:

我們可以在.h文件中extern聲明一些全局的常量

//聲明一些全局常量

extern?NSString?*?const?name;extern?NSInteger?const?count;

然后在.m文件中去實(shí)現(xiàn)

#import?//實(shí)現(xiàn)

NSString?*?const?name?=?@"王五";

NSInteger?const?count?=?3;

這樣沽一,只要導(dǎo)入頭文件茎活,就可以全局的使用定義的變量或常量。

三、結(jié)束語(yǔ)

當(dāng)然哮内,還有很多常見的關(guān)鍵字,后面見到了比較有價(jià)值的(有點(diǎn)難度又比較常見的)會(huì)繼續(xù)補(bǔ)充缆毁。本篇到此結(jié)束荔棉,如有疏漏,望請(qǐng)指正诡必!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奢方,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爸舒,更是在濱河造成了極大的恐慌蟋字,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扭勉,死亡現(xiàn)場(chǎng)離奇詭異鹊奖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涂炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門嫉入,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)焰盗,“玉大人,你說(shuō)我怎么就攤上這事咒林“揪埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵垫竞,是天一觀的道長(zhǎng)澎粟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)欢瞪,這世上最難降的妖魔是什么活烙? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮遣鼓,結(jié)果婚禮上啸盏,老公的妹妹穿的比我還像新娘。我一直安慰自己骑祟,他們只是感情好回懦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著次企,像睡著了一般怯晕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缸棵,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天舟茶,我揣著相機(jī)與錄音,去河邊找鬼堵第。 笑死吧凉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踏志。 我是一名探鬼主播阀捅,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狰贯!你這毒婦竟也來(lái)了也搓?” 一聲冷哼從身側(cè)響起赏廓,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涵紊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后幔摸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摸柄,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年既忆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驱负。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦玖。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跃脊,靈堂內(nèi)的尸體忽然破棺而出宇挫,到底是詐尸還是另有隱情,我是刑警寧澤酪术,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布器瘪,位于F島的核電站,受9級(jí)特大地震影響绘雁,放射性物質(zhì)發(fā)生泄漏橡疼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一庐舟、第九天 我趴在偏房一處隱蔽的房頂上張望欣除。 院中可真熱鬧,春花似錦挪略、人聲如沸历帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抹缕。三九已至,卻和暖如春墨辛,著一層夾襖步出監(jiān)牢的瞬間卓研,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工睹簇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奏赘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓太惠,卻偏偏與公主長(zhǎng)得像磨淌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凿渊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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