在iOS中內(nèi)存主要分為五大區(qū)域:棧區(qū)、堆區(qū)、靜態(tài)區(qū)、常量區(qū)、代碼段

image.png
棧區(qū)
- 是
一段連續(xù)的內(nèi)存區(qū)域,從高地址向低地址存儲,遵循先進(jìn)后出(FILO)原則。 - 在
x86架構(gòu)下,棧的地址一般為0X7開頭 - 一般在運(yùn)行時進(jìn)行分配,內(nèi)存空間由
系統(tǒng)管理,變量過了作用域范圍后內(nèi)存便會自動釋放。 -
參數(shù)、函數(shù)、局部變量都放在棧區(qū) -
參數(shù)入棧是從前往后入棧。而結(jié)構(gòu)體入棧是從后往前入棧
堆區(qū)
- 是
不連續(xù)的內(nèi)存從低地址向高地址存儲,遵循先進(jìn)先出(FIFO)原則。 - 堆的地址空間iOS
x86架構(gòu)下以0X6開頭,空間的分配是動態(tài)的 - 需要關(guān)注變量的生命周期,不及時釋放會造成
內(nèi)存泄露 -
OC中使用alloc、new開辟空間創(chuàng)建的對象內(nèi)存放在堆區(qū)(而指向內(nèi)存的指針還是在棧里) - C語言中使用malloc、calloc、realloc分配的空間,需要free釋放。
棧區(qū)與堆區(qū)對比
- 棧是
一段連續(xù)的內(nèi)存區(qū)域,堆是不連續(xù)的內(nèi)存 - 棧
系統(tǒng)自動回收內(nèi)存,堆需要開發(fā)人員手動釋放 - 棧
內(nèi)存大小有限制,內(nèi)存空間小,堆內(nèi)存空間大
棧區(qū)與堆區(qū)相關(guān)面試體
為什么將開辟的空間放入堆區(qū)
【答】因為棧區(qū)內(nèi)存比較少,而堆區(qū)內(nèi)存比較大
棧區(qū)的內(nèi)存如何去定位
【答】通過sp寄存器直接定位
堆區(qū)內(nèi)存如何定位
【答】通過sp寄存器來定位到棧內(nèi)存地址,通過該地址定位堆內(nèi)存地址,所以說棧定位比堆定位速度快
全局靜態(tài)區(qū)
- 該區(qū)是
編譯時分配的內(nèi)存空間,在iOS中一般以0x1開頭,程序運(yùn)行過程中,此內(nèi)存中的數(shù)據(jù)一直存在,程序結(jié)束后由系統(tǒng)釋放。 - 未初始化的全局變量和靜態(tài)變量,在
BSS區(qū),即未初始化區(qū),.bss - 已初始化的全局變量和靜態(tài)變量,在
數(shù)據(jù)區(qū),即初始化區(qū),.data
常量區(qū)
- 該區(qū)是編譯時分配的內(nèi)存空間,在程序運(yùn)行過程中,此內(nèi)存中的數(shù)據(jù)一直存在,程序結(jié)束后由系統(tǒng)釋放。
- 存放常量:整型、字符型、浮點、字符串等。
代碼區(qū)
- 該區(qū)是編譯時分配的內(nèi)存空間,在程序運(yùn)行過程中,此內(nèi)存中的數(shù)據(jù)一直存在,程序結(jié)束后由系統(tǒng)釋放。
-
程序運(yùn)行時的代碼會被編譯成二進(jìn)制,存進(jìn)內(nèi)存的代碼區(qū)域。