在iOS中內(nèi)存主要分為五大區(qū)域:棧區(qū)渗蟹、堆區(qū)、靜態(tài)區(qū)赞辩、常量區(qū)雌芽、代碼段
棧區(qū)
- 是
一段連續(xù)的內(nèi)存區(qū)域
,從高地址向低地址存儲
辨嗽,遵循先進后出(FILO)原則世落。 - 在
x86
架構下,棧的地址一般為0X7
開頭 - 一般在運行時進行分配糟需,內(nèi)存空間由
系統(tǒng)管理
屉佳,變量過了作用域范圍后內(nèi)存便會自動釋放谷朝。 -
參數(shù)、函數(shù)武花、局部變量
都放在棧區(qū) -
參數(shù)入棧
是從前往后
入棧圆凰。而結構體入棧
是從后往前入棧
堆區(qū)
- 是
不連續(xù)的內(nèi)存
從低地址向高地址
存儲,遵循先進先出(FIFO)原則体箕。 - 堆的地址空間iOS
x86
架構下以0X6
開頭专钉,空間的分配是動態(tài)的 - 需要關注變量的生命周期,不及時釋放會造成
內(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ū)相關面試體
為什么將開辟的空間放入堆區(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
開頭冲泥,程序運行過程中驹碍,此內(nèi)存中的數(shù)據(jù)一直存在,程序結束后由系統(tǒng)釋放凡恍。 - 未初始化的全局變量和靜態(tài)變量志秃,在
BSS區(qū)
,即未初始化區(qū)嚼酝,.bss
- 已初始化的全局變量和靜態(tài)變量浮还,在
數(shù)據(jù)區(qū)
,即初始化區(qū)闽巩,.data
常量區(qū)
- 該區(qū)是編譯時分配的內(nèi)存空間钧舌,在程序運行過程中,此內(nèi)存中的數(shù)據(jù)一直存在涎跨,程序結束后由系統(tǒng)釋放洼冻。
- 存放常量:整型、字符型隅很、浮點撞牢、字符串等。
代碼區(qū)
- 該區(qū)是編譯時分配的內(nèi)存空間,在程序運行過程中屋彪,此內(nèi)存中的數(shù)據(jù)一直存在所宰,程序結束后由系統(tǒng)釋放。
-
程序運行時的代碼
會被編譯成二進制畜挥,存進內(nèi)存的代碼區(qū)域仔粥。