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

image.png
栈区
- 是
一段连续的内存区域,从高地址向低地址存储,遵循先进后出(FILO)原则。 - 在
x86架构下,栈的地址一般为0X7开头 - 一般在运行时进行分配,内存空间由
系统管理,变量过了作用域范围后内存便会自动释放。 -
参数、函数、局部变量都放在栈区 -
参数入栈是从前往后入栈。而结构体入栈是从后往前入栈
堆区
- 是
不连续的内存从低地址向高地址存储,遵循先进先出(FIFO)原则。 - 堆的地址空间iOS
x86架构下以0X6开头,空间的分配是动态的 - 需要关注变量的生命周期,不及时释放会造成
内存泄露 -
OC中使用alloc、new开辟空间创建的对象内存放在堆区(而指向内存的指针还是在栈里) - C语言中使用malloc、calloc、realloc分配的空间,需要free释放。
栈区与堆区对比
- 栈是
一段连续的内存区域,堆是不连续的内存 - 栈
系统自动回收内存,堆需要开发人员手动释放 - 栈
内存大小有限制,内存空间小,堆内存空间大
栈区与堆区相关面试体
为什么将开辟的空间放入堆区
【答】因为栈区内存比较少,而堆区内存比较大
栈区的内存如何去定位
【答】通过sp寄存器直接定位
堆区内存如何定位
【答】通过sp寄存器来定位到栈内存地址,通过该地址定位堆内存地址,所以说栈定位比堆定位速度快
全局静态区
- 该区是
编译时分配的内存空间,在iOS中一般以0x1开头,程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。 - 未初始化的全局变量和静态变量,在
BSS区,即未初始化区,.bss - 已初始化的全局变量和静态变量,在
数据区,即初始化区,.data
常量区
- 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
- 存放常量:整型、字符型、浮点、字符串等。
代码区
- 该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
-
程序运行时的代码会被编译成二进制,存进内存的代码区域。