static
static分兩種情況蹂季,修飾局部變量和全局變量冕广。
我們首先要搞清楚生命周期和作用域的概念。
生命周期:這個變量能存活多久偿洁,它所占用的內(nèi)存什么時候分配撒汉,什么時候收回。
作用域:說白了就是這個變量在什么區(qū)域是可見的涕滋,可以拿來用的睬辐。
static修飾局部變量
在函數(shù)或者說代碼塊內(nèi)部聲明的變量叫局部變量。
局部變量
局部變量是存儲在棧區(qū)的宾肺,它的生命周期是整個代碼塊溯饵,作用域也是整個代碼塊,一旦出了這個代碼塊爱榕,存儲局部變量的這個棧內(nèi)存就會被回收瓣喊,局部變量也就被銷毀了∏郑看一個例子:
打印結(jié)果:
這個其實(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修飾:
看一下打印結(jié)果:
當(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:
ViewController.m:
結(jié)果:
當(dāng)全局變量使用static修飾時,其生命周期沒有變重绷,依舊是在程序結(jié)束時才銷毀沸停。但是其作用域變了,以前是整個源程序昭卓,現(xiàn)在只限于申明它的這個文件才可見愤钾,即使用extern引用也不行,比如我們把上面的例子中g(shù)lobalVar前面用static修飾候醒,那么程序就會報(bào)錯:
總結(jié):
static修飾局部變量:將局部變量的本來分配在棧區(qū)改為分配在靜態(tài)存儲區(qū)能颁,也就改變了局部變量的生命周期。
static修飾全局變量:本來是在整個源程序的所有文件都可見倒淫,static修飾后伙菊,改為只在申明自己的文件可見,即修改了作用域。
const
const修飾變量主要強(qiáng)調(diào)變量是不可修改的镜硕。我們看一下下面代碼段:
從結(jié)果可以看到變量a的值修改成功运翼,那么我們將變量a用const修飾試一試:
使用const修飾變量a之后,a的值就不能修改了兴枯,所以這里修改就不成功了南蹂。
下面例子是const修飾*str這個整體晚顷,所以這個整體不能改變峰伙,這個整體是str指向的內(nèi)存中的值。需要注意的一點(diǎn)是,const修飾的是其右邊的值念恍,也就是const右邊的這個整體的值不能改變。
下面例子是const修飾str的该默,所以str指向的地址不能改變瞳氓,因此這里的改變就產(chǎn)生了錯誤。
一般聯(lián)合使用static和const來定義一個只能在本文件中使用的栓袖,不能修改的變量:
這樣定義相對于用#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:
LMConst.m:
pch文件:
然后我們就可以直接在其他文件中使用NOTIFICATION_NAME這個字符串常量了: