iOS 中的内存管理

内存管理

内存分配方式有三种: 程序员

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

Objective-C内存管理

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

对象和变量的区别swift

  • 对象是一段存储空间
  • 变量由对象的声明引入。变量的名称表示对象。
NSObject *obj = [[NSObject alloc] init];复制代码

这行代码建立了一个 NSObject 类型的指针 obj 和一个 NSObject 类型的对象,obj 指针存储在栈上,而其指向的对象则存储在堆上(简称为堆对象)缓存

Swift内存管理

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

  • 引用类型 堆上
  • 值类型老是分配在它声明的地方

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

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

  1. 值类型/引用类型
  2. 局部对象/属性(对象或类)

接着明确 这两组因素对 存储位置的影响指针

因素 值类型 引用类型
局部对象
属性

值类型老是分配在它声明的地方:做为字段时,跟随其所属的变量(实例)存储;做为局部变量时,存储在栈上。code

注意:引用类型中的值类型字段 也是存储在堆上的.对象

为何栈的速度快?

  • 栈没有碎片,寻址间距短,能够被 CPU 预测行为
  • 栈能够利用到 CPU 的高速缓存
  • 栈无需释放内存和进行随机寻址
  • 栈内存清除只需移动指针

关于虚拟内存的补充

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

可是iOS的虚拟内存,并无内存与外存数据交换的功能。

相关文章
相关标签/搜索