內(nèi)存五大區(qū)由高到底分別為桟區(qū)
、堆區(qū)
、全局區(qū)
、常量區(qū)
、代碼區(qū)
全局區(qū)又分為.bss
(未初始化)、.data
(初始化)
桟 (Stack)
- 連續(xù)的內(nèi)存區(qū)域
- 在iOS中以
0x7
開頭
主要存儲 局部變量,函數(shù)參數(shù)
由編譯器自動(dòng)分配并釋放,雖然不用我們?nèi)ス芾恚菞C的大小也是限制的
堆區(qū) (Heap)
- 不連續(xù)的內(nèi)存區(qū)域,類似鏈表
- 在iOS中以
0x6
開頭
我們自己創(chuàng)建的對象,需要自己釋放,需要經(jīng)常增加和刪除,所以放在堆區(qū)
創(chuàng)建好后需要經(jīng)常查找,所以對象的指針放在桟區(qū)
當(dāng)需要訪問堆中內(nèi)存時(shí),一般需要先通過對象讀取到棧區(qū)的指針地址,然后通過指針地址訪問堆區(qū)
全局區(qū) (.bss & .data)
- 在iOS中以`0x1開頭
常量區(qū)
常量區(qū)是編譯時(shí)分配的內(nèi)存空間,在程序結(jié)束后由系統(tǒng)釋放,主要存放已經(jīng)使用了的,且沒有指向的字符串常量
字符串常量因?yàn)榭赡茉诔绦蛑斜欢啻问褂茫訿在程序運(yùn)行之前就會(huì)提前分配內(nèi)存
代碼區(qū)
代碼區(qū)是編譯時(shí)分配主要用于存放程序運(yùn)行時(shí)的代碼,代碼會(huì)被編譯成二進(jìn)制存進(jìn)內(nèi)存的
堆棧溢出
局部變量、函數(shù)的參數(shù)等都在桟里,而桟的大小肯定不是無限大的,桟由高到地,堆由地到高,當(dāng)相互碰撞的時(shí)候,就會(huì)產(chǎn)升堆棧溢出。當(dāng)使用遞歸的時(shí)候尤其要注意