iOS中static九巡,const,extern相關(guān)的問題

static

static分兩種情況蹂季,修飾局部變量和全局變量冕广。
我們首先要搞清楚生命周期和作用域的概念。
生命周期:這個變量能存活多久偿洁,它所占用的內(nèi)存什么時候分配撒汉,什么時候收回。
作用域:說白了就是這個變量在什么區(qū)域是可見的涕滋,可以拿來用的睬辐。

static修飾局部變量

在函數(shù)或者說代碼塊內(nèi)部聲明的變量叫局部變量。

局部變量
局部變量是存儲在棧區(qū)的宾肺,它的生命周期是整個代碼塊溯饵,作用域也是整個代碼塊,一旦出了這個代碼塊爱榕,存儲局部變量的這個棧內(nèi)存就會被回收瓣喊,局部變量也就被銷毀了∏郑看一個例子:


154A5B98-3837-4AFC-8769-0BFC0A7A0D13.png

打印結(jié)果:


B876F968-8313-4AC7-877B-4E006177C5D4.png

這個其實(shí)很好理解藻三,局部變量a是在test方法的代碼塊內(nèi)聲明的,所以它的生命周期就是這個代碼塊跪者,當(dāng)我們調(diào)用完一次test方法后棵帽,局部變量a就被銷毀了,不存在了渣玲。在下一次調(diào)用test方法時又在棧區(qū)重新申請了內(nèi)存逗概。

當(dāng)我們用static修飾局部變量時,變量被稱為靜態(tài)局部變量忘衍,這個靜態(tài)局部變量和全局變量逾苫,靜態(tài)全局變量一樣卿城,是存儲在靜態(tài)存儲區(qū)。**由于存儲在靜態(tài)存儲區(qū)铅搓,所以這塊內(nèi)存直到程序結(jié)束才會銷毀瑟押。也就是說,靜態(tài)局部變量的生命周期是整個源程序星掰。但是它只在聲明它的代碼塊可見多望,也就是說它的作用域是聲明它的代碼塊。我們把局部變量a用static修飾:


37ACD3B5-0144-475F-9FAB-488B531FE7EC.png

看一下打印結(jié)果:


C641FAA8-B34E-4ADB-9B49-D298B4F5B6B4.png

當(dāng)我們第一次調(diào)用test方法時氢烘,在靜態(tài)存儲區(qū)申請了一塊內(nèi)存嗎怀偷,這塊內(nèi)存名字叫a,里面裝著數(shù)字0播玖,然后把數(shù)字0加1椎工,變成了1,當(dāng)?shù)诙握{(diào)用test方法時黎棠,會去靜態(tài)存儲區(qū)查找有沒有一塊內(nèi)存叫a晋渺,如果有那就不用重新分配內(nèi)存初始化,這里找到了這塊叫a的內(nèi)存脓斩,所以不用進(jìn)行初始化木西,所以a里面還是裝的1然后對1加1,得到了2.

static修飾全局變量

當(dāng)全局變量沒有使用static修飾符時随静,其存儲在靜態(tài)存儲區(qū)八千,直到程序結(jié)束才銷毀。也就是其作用域是整個源程序燎猛。我們可以使用extern關(guān)鍵字來引用這個全局變量恋捆。
Test.h:


D85D06AF-22C3-47AF-BE92-A66C62861625.png

ViewController.m:


AC031735-2A65-47ED-BB74-4529FF7BFA5D.png

結(jié)果:
26561BDB-9FD6-4CCD-8CB8-011975B1F83D.png

當(dāng)全局變量使用static修飾時,其生命周期沒有變重绷,依舊是在程序結(jié)束時才銷毀沸停。但是其作用域變了,以前是整個源程序昭卓,現(xiàn)在只限于申明它的這個文件才可見愤钾,即使用extern引用也不行,比如我們把上面的例子中g(shù)lobalVar前面用static修飾候醒,那么程序就會報(bào)錯:


FB4F79AF-E4AA-408B-A25F-BF26B7C606B3.png

總結(jié):

static修飾局部變量:將局部變量的本來分配在棧區(qū)改為分配在靜態(tài)存儲區(qū)能颁,也就改變了局部變量的生命周期。
static修飾全局變量:本來是在整個源程序的所有文件都可見倒淫,static修飾后伙菊,改為只在申明自己的文件可見,即修改了作用域。

const

const修飾變量主要強(qiáng)調(diào)變量是不可修改的镜硕。我們看一下下面代碼段:


5050FCE5-6A86-4F68-A794-5E3F8CC86C13.png

從結(jié)果可以看到變量a的值修改成功运翼,那么我們將變量a用const修飾試一試:


8F939E74-03E0-48F2-8E58-CD0194F4A2D7.png

使用const修飾變量a之后,a的值就不能修改了兴枯,所以這里修改就不成功了南蹂。

需要注意的一點(diǎn)是,const修飾的是其右邊的值念恍,也就是const右邊的這個整體的值不能改變。

下面例子是const修飾*str這個整體晚顷,所以這個整體不能改變峰伙,這個整體是str指向的內(nèi)存中的值。
1345DCCC-0316-4999-B30F-53F8655968A5.png

下面例子是const修飾str的该默,所以str指向的地址不能改變瞳氓,因此這里的改變就產(chǎn)生了錯誤。
ED720026-9378-45A4-A5B9-63E852FC39B4.png

一般聯(lián)合使用static和const來定義一個只能在本文件中使用的栓袖,不能修改的變量:


46C52B94-D850-4CAF-B11A-05DAE7063D00.png

這樣定義相對于用#define來定義的話匣摘,優(yōu)點(diǎn)就在于它指定了變量的類型,而#define是不能指定變量的類型的裹刮。

extern

extern主要是用來引用全局變量音榜,它的原理就是先在本文件中查找,本文件中查找不到再到其他文件中查找捧弃。
常把extern和const聯(lián)合使用在項(xiàng)目中創(chuàng)建一個文件赠叼,這個文件文件中包含整個項(xiàng)目中都能訪問的全局常量。比如我們在項(xiàng)目中創(chuàng)建的這個文件為LMConst.h,LMConst.m违霞。
LMConst.h:


F839F033-351A-4F1C-AFE3-9292E3AAAE7E.png

LMConst.m:


D1DEB473-056A-4FB8-A3E4-CC9A0D8B4A71.png

pch文件:


405BB80C-BFBF-40B4-81E1-46331F4A895D.png

然后我們就可以直接在其他文件中使用NOTIFICATION_NAME這個字符串常量了:


963360B7-A451-4862-A009-71737A3064C1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘴办,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子买鸽,更是在濱河造成了極大的恐慌涧郊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眼五,死亡現(xiàn)場離奇詭異妆艘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弹砚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門双仍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桌吃,你說我怎么就攤上這事朱沃。” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵逗物,是天一觀的道長搬卒。 經(jīng)常有香客問我,道長翎卓,這世上最難降的妖魔是什么契邀? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮失暴,結(jié)果婚禮上坯门,老公的妹妹穿的比我還像新娘。我一直安慰自己逗扒,他們只是感情好古戴,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矩肩,像睡著了一般现恼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黍檩,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天叉袍,我揣著相機(jī)與錄音,去河邊找鬼刽酱。 笑死喳逛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棵里。 我是一名探鬼主播艺配,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衍慎!你這毒婦竟也來了转唉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稳捆,失蹤者是張志新(化名)和其女友劉穎赠法,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乔夯,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砖织,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了末荐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侧纯。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甲脏,靈堂內(nèi)的尸體忽然破棺而出眶熬,到底是詐尸還是另有隱情妹笆,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布娜氏,位于F島的核電站拳缠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贸弥。R本人自食惡果不足惜窟坐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绵疲。 院中可真熱鬧哲鸳,春花似錦、人聲如沸盔憨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽般渡。三九已至,卻和暖如春芙盘,著一層夾襖步出監(jiān)牢的瞬間驯用,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工儒老, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝴乔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓驮樊,卻偏偏與公主長得像薇正,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子囚衔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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