美文网首页
iOS的内存管理

iOS的内存管理

作者: 六月的第三天 | 来源:发表于2017-05-01 16:04 被阅读22次

内存管理

内存分配方式有三种:

从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
Objective-C内存管理

局部变量: 栈
全局/静态变量: 静态全局区
Objective-C 对象: 堆

对象和变量的区别
对象是一段存储空间
变量由对象的声明引入。变量的名称表示对象。
NSObject *obj = [[NSObject alloc] init];
这行代码创建了一个 NSObject 类型的指针 obj 和一个 NSObject 类型的对象,obj 指针存储在栈上,而其指向的对象则存储在堆上(简称为堆对象)

Swift内存管理

Swift的内存管理基本和OC相同
由于引入了值类型和引用类型又变得复杂了一些.

引用类型 堆上
值类型总是分配在它声明的地方
可能有小伙伴会疑惑:
引用类型的值类型呢?
值类型总是分配在它声明的地方

见下表:
先明确两组概念:

值类型/引用类型
局部对象/属性(对象或类)
接着明确 这两组因素对 存储位置的影响

因素 值类型 引用类型
局部对象 栈 堆
属性 堆 堆
值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。

注意:引用类型中的值类型字段 也是存储在堆上的.
为什么栈的速度快?

栈没有碎片,寻址间距短,可以被 CPU 预测行为
栈可以利用到 CPU 的高速缓存
栈无需释放内存和进行随机寻址
栈内存清除只需移动指针
关于虚拟内存的补充

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

但是iOS的虚拟内存,并没有内存与外存数据交换的功能。

相关文章

网友评论

      本文标题:iOS的内存管理

      本文链接:https://www.haomeiwen.com/subject/iezftxtx.html