ios內(nèi)存五大分區(qū)

iOS中,內(nèi)存主要分為棧區(qū)、堆區(qū)、全局區(qū)、常量區(qū)、代碼區(qū)五大區(qū)域

  1. 棧區(qū)

定義

棧是系統(tǒng)數(shù)據(jù)結構,其對應的進程或者線程是唯一的

棧是向低地址擴展的數(shù)據(jù)結構

棧是一塊連續(xù)的內(nèi)存區(qū)域,遵循先進后出(FILO)原則

棧的地址空間在iOS中是以0X7開頭

棧區(qū)一般在運行時分配

存儲

棧區(qū)是由編譯器自動分配并釋放的,主要用來存儲

局部變量

函數(shù)的參數(shù),例如函數(shù)的隱藏參數(shù)(id self,SEL _cmd)

優(yōu)缺點

優(yōu)點:因為棧是由編譯器自動分配并釋放的,不會產(chǎn)生內(nèi)存碎片,所以快速高效

缺點:棧的內(nèi)存大小有限制,數(shù)據(jù)不靈活

iOS主線程棧大小是1MB

其他主線程是512KB

MAC只有8M

傳入函數(shù)的參數(shù)值、函數(shù)體內(nèi)聲明的局部變量等,由編譯器自動分配釋放,通常在函數(shù)執(zhí)行結束后就釋放了。(注意:不包括static修飾的變量,static意味該變量存放在全局/靜態(tài)區(qū))其操作方式類似數(shù)據(jù)結構中的棧,先進后出。

棧內(nèi)存分配運算內(nèi)置于處理器的指令集,效率很高,但是分配的內(nèi)存容量有限,比如iOS中棧區(qū)的大小是2M(看網(wǎng)上說,也有人說1M,我也不知道具體大小,但棧區(qū)的內(nèi)存肯定不會太大)。

存放的局部變量、先進后出、一旦出了作用域就會被銷毀;函數(shù)跳轉(zhuǎn)地址,現(xiàn)場保護等;

程序猿不需要管理棧區(qū)變量的內(nèi)存

棧區(qū)地址從高到低分配;

2.堆區(qū)

定義

堆是向高地址擴展的數(shù)據(jù)結構

堆是不連續(xù)的內(nèi)存區(qū)域,類似于鏈表結構(便于增刪,不便于查詢),遵循先進先出(FIFO)原則

堆的地址空間在iOS中是以0x6開頭,其空間的分配總是動態(tài)的

堆區(qū)的分配一般是在運行時分配

存儲

堆區(qū)是由程序員動態(tài)分配和釋放的,如果程序員不釋放,程序結束后,可能由操作系統(tǒng)回收,主要用于存放

OC中使用alloc或者 使用new開辟空間創(chuàng)建對象

C語言中使用malloc、calloc、realloc分配的空間,需要free釋放

優(yōu)缺點

優(yōu)點:靈活方便,數(shù)據(jù)適應面廣泛

缺點:需手動管理,速度慢、容易產(chǎn)生內(nèi)存碎片

當需要訪問堆中內(nèi)存時,一般需要先通過對象讀取到棧區(qū)的指針地址,然后通過指針地址訪問堆區(qū)

堆區(qū)的內(nèi)存是由代碼分配和釋放,用于存放進程運行中被動態(tài)分配的內(nèi)存段,堆區(qū)的大小并不固定,可動態(tài)擴張或縮減。

變量通過new、alloc、malloc、realloc分配的內(nèi)存塊就存放在堆區(qū)。

堆區(qū)的內(nèi)存都是動態(tài)分配的。

當進程調(diào)用alloc等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)添加到堆上(堆被擴張)。

當利用realse釋放內(nèi)存時,被釋放的內(nèi)存從堆中被剔除(堆被縮減)。

如果應用程序沒有釋放掉,操作系統(tǒng)會自動回收,分配方式類似于鏈表。

因為現(xiàn)在iOS基本都使用ARC來管理對象,所以也不需要手動釋放。

一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便。

  1. 全局/靜態(tài)區(qū)域 即.bss

全局區(qū)是編譯時分配的內(nèi)存空間,在iOS中一般以0x1開頭,在程序運行過程中,此內(nèi)存中的數(shù)據(jù)一直存在,程序結束后由系統(tǒng)釋放,主要存放

未初始化的全局變量

未初始化的靜態(tài)變量

由static修飾的變量會成為靜態(tài)變量,該變量的內(nèi)存由全局/靜態(tài)區(qū)在編譯階段完成分配,且僅分配一次。

static可以修飾局部變量也可以修飾全局變量。

  1. 常量區(qū)

常量區(qū)是編譯時分配的內(nèi)存空間,在iOS中一般以0x1開頭,在程序結束后由系統(tǒng)釋放,主要存放

已初始化的全局變量

已初始化的靜態(tài)變量(即Static)

  1. 代碼區(qū)

代碼區(qū)是編譯時分配主要用于存放程序運行時的代碼,代碼會被編譯成二進制存進內(nèi)存的

代碼區(qū)需要防止在運行時被非法修改,所以只準許讀取操作,而不允許寫入(修改)操作——它是不可寫的。

通常代碼段是可共享的,這使得需要頻繁被執(zhí)行的程序只需要在內(nèi)存中擁有一份拷貝即可。代碼段也通常是只讀的,這樣可以防止其他程序意外地修改其指令。另外,代碼段還規(guī)劃了局部數(shù)據(jù)所申請的內(nèi)存空間信息。 代碼段(code segment/text segment)通常是指用來存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。這部分區(qū)域的大小在程序運行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀, 某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。

感謝作者內(nèi)容轉(zhuǎn)自 鏈接:http://www.itdecent.cn/p/7f9483f9c92a

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容