内存管理
内存分配方式有三种:
从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
Objective-C内存管理
局部变量: 栈
全局/静态变量: 静态全局区
Objective-C 对象: 堆
对象和变量的区别
对象是一段存储空间
变量由对象的声明引入。变量的名称表示对象。
NSObject *obj = [[NSObject alloc] init];
这行代码创建了一个 NSObject 类型的指针 obj 和一个 NSObject 类型的对象,obj 指针存储在栈上,而其指向的对象则存储在堆上(简称为堆对象)
Swift内存管理
Swift的内存管理基本和OC相同
由于引入了值类型和引用类型又变得复杂了一些.
引用类型 堆上
值类型总是分配在它声明的地方
可能有小伙伴会疑惑:
引用类型的值类型呢?
值类型总是分配在它声明的地方
见下表:
先明确两组概念:
值类型/引用类型
局部对象/属性(对象或类)
接着明确 这两组因素对 存储位置的影响
因素 值类型 引用类型
局部对象 栈 堆
属性 堆 堆
值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。
注意:引用类型中的值类型字段 也是存储在堆上的.
为什么栈的速度快?
栈没有碎片,寻址间距短,可以被 CPU 预测行为
栈可以利用到 CPU 的高速缓存
栈无需释放内存和进行随机寻址
栈内存清除只需移动指针
关于虚拟内存的补充
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
但是iOS的虚拟内存,并没有内存与外存数据交换的功能。
网友评论