iOS-底层原理23-内存五大区

《iOS底层原理文章汇总》

1.栈区(stack):由编译器自动分配并释放,存放函数的参数值比如(id self, SEL _cmd),局部变量等。栈是系统数据结构,对应线程/进程是唯一的。栈是高地址向低地址扩展的数据结构,是一块连续的内存的区域;先进后出(FILO—First-In/Last-Out)栈的地址空间是以0x7开头,栈是在运行时开辟

优点:由于是编译器自动创建和释放的,所以不会产生内存碎片;一块连续的内存区域,所以查找速度快
缺点:由于是一块连续的内存区域,所以存储空间内存大小有限制(iOS主线程栈大小1MB,其他线程是512KB。(Mac也只有8M)),数据不灵活

2.堆区(heap):由程序员分配和释放,如果程序员不释放,程序结束后,可能由操作系统回收,类似于链表;堆是低地址向高地址扩展的数据结构,是不连续的内存区域方便增、删、改;先进先出(FIFO—first in first out)堆的地址空间是以0x6开头,堆一般是在运行时分配内存

优点:灵活方便,数据适应面广泛,变量通过new、alloc、malloc、realloc生成的内存放在堆区
缺点:由于是运行时开辟,且内存区域是不连续的,导致容易出现内存碎片,需手动管理、速度慢、容易产生内存碎片

3.全局区(静态区):全局变量和静态变量的存储区,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,在iOS中一般以0x1开头,在程序运行时一直存在,程序结束后由系统释放。

static修饰的变量成为静态变量,该变量内存放在全局区(静态区),由程序编译时创建。
static可以修饰局部变量也可以修饰全局变量

4.常量区:常量区是一块比较特殊的存储区,常量区里面存放的是常量,常量字符串就存放在常量区。 常量区的内存在编译阶段完成分配,程序运行时会一直存在内存中,只有当程序结束后才会由操作系统释放。

5.代码区:存放可执行代码的二进制文件区,它在程序编译时存入,只可读不可写

当栈中的指针地址指向堆分配的内存空间,堆中的内存空间free后内存清空,则栈中的指针地址指向一片未知的内存区域就变为野指针

你可能感兴趣的:(iOS-底层原理23-内存五大区)