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