iOS内存管理-内存五大区

在iOS中内存主要分为五大区域:栈区、堆区、静态区、常量区、代码段


image.png

栈区

  • 一段连续的内存区域,从高地址向低地址存储,遵循先进后出(FILO)原则。
  • x86架构下,栈的地址一般为0X7开头
  • 一般在运行时进行分配,内存空间由系统管理,变量过了作用域范围后内存便会自动释放。
  • 参数、函数、局部变量都放在栈区
  • 参数入栈从前往后入栈。而结构体入栈从后往前入栈

堆区

  • 不连续的内存低地址向高地址存储,遵循先进先出(FIFO)原则。
  • 堆的地址空间iOSx86架构下以0X6开头,空间的分配是动态的
  • 需要关注变量的生命周期,不及时释放会造成内存泄露
  • OC中使用alloc、new开辟空间创建的对象内存放在堆区(而指向内存的指针还是在栈里)
  • C语言中使用malloc、calloc、realloc分配的空间,需要free释放。

栈区与堆区对比

  • 栈是一段连续的内存区域,堆是不连续的内存
  • 系统自动回收内存,堆需要开发人员手动释放
  • 内存大小有限制,内存空间小,堆内存空间大

栈区与堆区相关面试体

为什么将开辟的空间放入堆区

【答】因为栈区内存比较少,而堆区内存比较大

栈区的内存如何去定位

【答】通过sp寄存器直接定位

堆区内存如何定位

【答】通过sp寄存器来定位到栈内存地址,通过该地址定位堆内存地址,所以说栈定位比堆定位速度快

全局静态区

  • 该区是编译时分配的内存空间,在iOS中一般以0x1开头,程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 未初始化的全局变量和静态变量,在BSS区,即未初始化区,.bss
  • 已初始化的全局变量和静态变量,在数据区,即初始化区,.data

常量区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 存放常量:整型、字符型、浮点、字符串等。

代码区

  • 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 程序运行时的代码会被编译成二进制,存进内存的代码区域。

你可能感兴趣的:(iOS内存管理-内存五大区)