iOS內(nèi)存管理-內(nèi)存五大區(qū)

在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)原則。
  • 堆的地址空間iOSx86架構(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ū)域。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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