内存分区:
iOS中主要是栈区(stack)、堆区(heap)、全局区/静态区(staic) 、常量区、代码区;
一、栈区
- 存放局部变量(临时变量),先进后出,一旦出了作用域就会被销毁,函数跳转地址,现场保护等。
- 程序猿不需要管理栈区变量的内存;
- 栈区的地址从高到低分配。
二、堆区
- 堆区的内存分配使用的是alloc;
- 堆区的地址是从低到高分配;
- ARC原理是基于堆区,编译器在编译的时候给对象自动添加retain,release,autorelease;
- 在ios中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;
三、全局区/静态区(static):
包括两个部分:未初始化过 、初始化过;
也就是说,(全局区/静态区)在内存中是放在一起的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域;
eg:int a;未初始化的。int a = 10;已初始化的。
四、常量区
- 常量字符串就是放在这里,还有const常量。
五、代码区
存放App代码。
注意
- 堆区需要程序猿管理内存,是由alloc分配的内存,一般速度比较慢,容易产生内存碎片;
- 栈区不需要程序猿管理内存,由编译器自动分配并释放,速度快;
- 当一个app启动后,代码区,常量区,全局区大小都是已经固定的,因此指向这些区的指针不会产生崩溃性的错误,而堆区和栈区是时时刻刻变化的(堆得创建和销毁,栈的弹入和弹出),所以当使用一个指针指向这个2区里面内存的时候,一定要注意内存是否已经被释放,否则会产生程序崩溃(即野指针报错)
网友评论