程序的局部變量存在于(堆棧)中莹痢,全局變量存在于(靜態(tài)區(qū) )中种蘸,動態(tài)申請數(shù)據(jù)存在于( 堆)中。
補充:堆和棧的概念
因為:Objective-C的對象在內(nèi)存中是以堆的方式分配空間的,并且堆內(nèi)存是由你釋放的竞膳,就是release航瞭,OC對象存放于堆里面(堆內(nèi)存要程序員手動回收),非OC對象一般放在棧里面(棧內(nèi)存會被系統(tǒng)自動回收)坦辟,堆里面的內(nèi)存是動態(tài)分配的刊侯,所以也就需要程序員手動的去添加內(nèi)存、回收內(nèi)存
static作用:“改變生命周期” 或者 “改變作用域”
1.作用于變量:
用static聲明局部變量-------局部變量指在代碼塊{}內(nèi)部定義的變量锉走,只在代碼塊內(nèi)部有效(作用域)滨彻,其缺省的存儲方式是自動變量或說是動態(tài)存儲的,即指令執(zhí)行到變量定義處時才給變量分配存儲單元挪蹭,跳出代碼塊時釋放內(nèi)存單元(生命期)亭饵。用static聲明局部變量時,則改變變量的存儲方式(生命期)梁厉,使變量成為靜態(tài)的局部變量冬骚,即編譯時就為變量分配內(nèi)存,直到程序退出才釋放存儲單元。這樣只冻,使得該局部變量有記憶功能庇麦,可以記憶上次的數(shù)據(jù),不過由于仍是局部變量喜德,因而只能在代碼塊內(nèi)部使用(作用域不變)山橄。
用static聲明外部變量-------外部變量指在所有代碼塊{}之外定義的變量,它缺省為靜態(tài)變量舍悯,編譯時分配內(nèi)存航棱,程序結(jié)束時釋放內(nèi)存單元。同時其作用域很廣萌衬,整個文件都有效甚至別的文件也能引用它饮醇。為了限制某些外部變量的作用域,使其只在本文件中有效秕豫,而不能被其他文件引用朴艰,可以用static關(guān)鍵字對其作出聲明。
總結(jié):用static聲明局部變量混移,使其變?yōu)殪o態(tài)存儲方式(靜態(tài)數(shù)據(jù)區(qū))祠墅,作用域不變;用static聲明外部變量歌径,其本身就是靜態(tài)變量毁嗦,這只會改變其連接方式,使其只在本文件內(nèi)部有效回铛,而其他文件不可連接或引用該變量狗准。
2.作用于函數(shù):
使用static用于函數(shù)定義時,對函數(shù)的連接方式產(chǎn)生影響茵肃,使得函數(shù)只在本文件內(nèi)部有效驶俊,對其他文件是不可見的。這樣的函數(shù)又叫作靜態(tài)函數(shù)免姿。使用靜態(tài)函數(shù)的好處是,不用擔心與其他文件的同名函數(shù)產(chǎn)生干擾榕酒,另外也是對函數(shù)本身的一種保護機制胚膊。
如果想要其他文件可以引用本地函數(shù),則要在函數(shù)定義時使用關(guān)鍵字extern想鹰,表示該函數(shù)是外部函數(shù)紊婉,可供其他文件調(diào)用。另外在要引用別的文件中定義的外部函數(shù)的文件中辑舷,使用extern聲明要用的外部函數(shù)即可喻犁。
一、const與宏的區(qū)別(面試題):
const簡介:之前常用的字符串常量,一般是抽成宏肢础,但是蘋果不推薦我們抽成宏还栓,推薦我們使用const常量。
編譯時刻:宏是預編譯(編譯之前處理)传轰,const是編譯階段剩盒。
編譯檢查:宏不做檢查,不會報編譯錯誤慨蛙,只是替換辽聊,const會編譯檢查,會報編譯錯誤期贫。
宏的好處:宏能定義一些函數(shù)跟匆,方法。 const不能通砍。
宏的壞處:使用大量宏玛臂,容易造成編譯時間久,每次都需要重新替換埠帕。
注意:很多Blog都說使用宏垢揩,會消耗很多內(nèi)存,我這驗證并不會生成很多內(nèi)存敛瓷,宏定義的是常量叁巨,常量都放在常量區(qū),只會生成一份內(nèi)存呐籽。
二锋勺、const作用:限制類型
1.const僅僅用來修飾右邊的變量(基本數(shù)據(jù)變量p,指針變量*p)
2.被const修飾的變量是只讀的狡蝶。
三庶橱、const開發(fā)中使用場景:
1.需求1:提供一個方法,這個方法的參數(shù)是地址贪惹,里面只能通過地址讀取值,不能通過地址修改值
2.需求2:提供一個方法苏章,這個方法的參數(shù)是地址,里面不能修改參數(shù)的地址奏瞬。
四枫绅、static和extern簡單使用(要使用一個東西,先了解其作用)
static作用:
修飾局部變量:
1.延長局部變量的生命周期,程序結(jié)束才會銷毀硼端。
2.局部變量只會生成一份內(nèi)存,只會初始化一次并淋。
修飾全局變量:
1.只能在本文件中訪問,修改全局變量的作用域,生命周期不會改
2.避免重復定義全局變量
extern作用:
只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量
extern工作原理:
先在當前文件查找有沒有全局變量珍昨,沒有找到县耽,才會去其他文件查找句喷。
五、static與const聯(lián)合使用
static與const作用:聲明一個只讀的靜態(tài)變量
開發(fā)使用場景:在一個文件中經(jīng)常使用的字符串常量兔毙,可以使用static與const組合
六唾琼、extern與const聯(lián)合使用開發(fā)中使用場景:在多個文件中經(jīng)常使用的同一個字符串常量,可以使用extern與const組合瞒御。原因:static與const組合:在每個文件都需要定義一份靜態(tài)全局變量父叙。extern與const組合:只需要定義一份全局變量,多個文件共享肴裙。全局常量正規(guī)寫法:開發(fā)中便于管理所有的全局變量趾唱,通常搞一個GlobeConst文件,里面專門定義全局變量蜻懦,統(tǒng)一管理甜癞,要不然項目文件多不好找。