在iOS中,内存主要分为:栈区、堆区、全局区(静态区)、常量区以及代码区等五大区,本文主要分析这五大区。
栈区分析
什么是栈
- 栈是
系统数据结构,其对应的线程或进程是唯一的 - 栈是
从高地址向低地址扩展的数据结构 - 栈是
一块连续的内存区域,遵循先进后出原则 - 栈的地址空间是以
0x7开头 - 栈是在
运行时开辟
栈的存储
- 栈是由
编译器自动创建和释放的 - 存储局部变量,一旦离开作用于就会销毁释放
- 存储函数参数,包括隐藏函数,比如
(id self, SEL _cmd)
栈的优缺点
- 优点:由于是
编译器自动创建和释放的,所以不会产生内存碎片;一块连续的内存区域,所以查找速度快。 - 缺点:由于是
一块连续的内存区域,所以存储空间大小有限制,- iOS主线程默认是
1M,其他线程是512kb,实际上我们也可以通过线程的stackSpace去修改,但是成本有些大
- iOS主线程默认是
堆区
定义
- 堆是
从低地址向高地址扩展数据 - 堆的
内存区域是不连续的,方便增、删、改,类似链表 - 堆遵循
先进先出FIFO原则 - 堆的地址空间是以
0x6开头 - 堆一般是在
运行时分配内存
特点
- 变量通过
new、alloc、malloc、realloc生成的内存放在堆区 - 由于是
运行时开辟,且内存区域是不连续的,导致容易出现内存碎片 - 由于iOS目前都是
ARC管理内存,所以一般无需手动释放
全局区(静态区)
全局区(静态区)是编译时分配的内存区域。在iOS中一般以0x1开头,在程序运行时一直存在,直到程序结束释放空间。
- 已初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量存放在另一块区域
static修饰的变量成为静态变量,该变量内存放在全局区(静态区),由程序编译时创建。static可以修饰局部变量也可以修饰全局变量
常量区
常量区是一块比较特殊的存储区,常量区里面存放的是常量,常量字符串就存放在常量区。
常量区的内存在编译阶段完成分配,程序运行时会一直存在内存中,只有当程序结束后才会由操作系统释放。
代码区
存放可执行代码的二进制文件区,它在程序编译时存入,只可读不可写
总结
栈区、堆区内存空间是运行时分配的,因此随着程序运行而变化;在iOS中堆区的内存是应用程序共享的,堆区的内存分配是系统负责的。全局区(静态区)、常量区、代码区是在编译时分配,是固定的不可变的。