程序在系統(tǒng)中運行所需要的空間并不是統(tǒng)一的芋类,而是在內(nèi)存中不同的區(qū)域隆嗅,不同區(qū)域?qū)?nèi)存空間的管理是不同的,因而需要明確不同數(shù)據(jù)各自的內(nèi)存管理方式侯繁。
內(nèi)存區(qū)域
iOS中系統(tǒng)內(nèi)存區(qū)域主要分為以下五個區(qū)域胖喳,棧區(qū)、堆區(qū)贮竟、BSS段丽焊、數(shù)據(jù)區(qū)以及代碼段,見下圖咕别。
棧區(qū)
由系統(tǒng)分配內(nèi)存并對內(nèi)存進行管理技健,是一種先進后出向低地址擴展的數(shù)據(jù)結(jié)構(gòu),也就是說棧頂?shù)牡刂泛蜅5淖畲笕萘渴怯上到y(tǒng)預先設定好了的(1M或2M)惰拱,是一塊連續(xù)的內(nèi)存區(qū)域雌贱,用于存儲局部變量。iOS中的基本數(shù)據(jù)類型偿短,如int欣孤、float、struct等類型的局部變量都是存放在棧區(qū)昔逗。棧區(qū)特點:
優(yōu)點:快速高效降传,開發(fā)人員無需關(guān)注其內(nèi)存的釋放;
缺點:數(shù)據(jù)有限制且不夠靈活(數(shù)據(jù)大小與生存期必須是確定的)纤子。棸峁澹空間分配方式:
靜態(tài)分配:由編譯器完成,比如auto類型變量的分配控硼;
動態(tài)分配:由alloc完成泽论,與堆區(qū)的動態(tài)分配不同仍由系統(tǒng)自動管理。堆區(qū)
是一種先進先出向高地址擴展的數(shù)據(jù)機構(gòu)卡乾,是一塊不連續(xù)的數(shù)據(jù)區(qū)域翼悴。堆最大可達計算機虛擬內(nèi)存的大小。由開發(fā)者進行空間的申請和釋放,如不進行釋放會造成內(nèi)存泄漏鹦赎,程序結(jié)束后可能由操作系統(tǒng)回收谍椅,iOS中通過引用計數(shù)對對象的生命周期進行管理。堆區(qū)特點:
優(yōu)點:獲得空間靈活古话,分配內(nèi)存較大雏吭;
缺點:容易造成碎片(試想在1-4、7-10都申請了內(nèi)存陪踩,而我要申請8字節(jié)的大小的內(nèi)存杖们,其中5-8的內(nèi)存相對來說就成了碎片,只得到其他地址申請4字節(jié)的內(nèi)
存)肩狂,效率降低摘完。堆空間分配方式:
動態(tài)分配:由alloc分配內(nèi)存,速度較慢傻谁。BSS段
沒有初始化的全局變量和靜態(tài)變量存儲在這個區(qū)域孝治,程序退出后釋放。數(shù)據(jù)區(qū)
用于存儲已經(jīng)初始化的全局變量和靜態(tài)變量以及字符串常量审磁,程序退出后釋放谈飒。代碼段
用于存放已經(jīng)編譯后的二進制代碼,每一個指令态蒂,每一個單個函數(shù)步绸、過程、方法和執(zhí)行代碼都存在這個內(nèi)存段中直到應用程序退出吃媒。
一個程序啟動后其BSS段、數(shù)據(jù)區(qū)吕喘、代碼段的位置大小已固定赘那,因此指向這些區(qū)的指針就不會崩潰,而指向堆棧中的指針由于堆棧時刻在變化(棧的彈入彈出氯质、堆的創(chuàng)建銷毀)導致這些指針容易出現(xiàn)野指針募舟,所有需要注意這些指針的使用。
PS: I am xinghun who is on the road.