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