[Swift内存管理-示例讲解]
来源:互联网 发布:深圳龙华行知小学 编辑:程序博客网 时间:2024/04/29 13:32
具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理。而对于值类型,如整型、浮点型、布尔型、字符串、元组、集合、枚举和结构体等,是由处理器自动管理的,程序员不需要管理它们的内存。
一、引用计数
每个Swift类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,称为引用计数(Reference Count,简称RC)。当对象被创建的时候,引用计数为1,每次对象被引用的时候会使其引用计数加1,如果不需要的时候,对象引用断开(赋值为nil),其引用计数减1。当对象的引用计数为0的时候,对象的内存才被释放。
下图是内存引用计数原理示意图。图中的房间就好比是对象的内存,一个人进入房间打开灯,就是创建一个对象,这时候对象的引用计数是1。有人进入房间,引用计数加1;有人离开房间,引用计数减1。最后一个人离开房间,引用计数为0,房间灯关闭,对象内存才被释放。
二、示例:Swift自动引用计数
下面我们通过一个示例了解一下Swift中的自动引用计数原理。下图是Employee类创建的对象的生命周期,该图描述了对象被赋值给3个变量,以及它们的释放过程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Employee { ①
var no : Int
var name : String
var job : String
var salary : Double
init(no : Int, name: String, job : String, salary : Double) { ②
self.no = no
self.name = name
self.job = job
self.salary = salary
println("员工\(name) 已经构造成功。") ③
}
deinit { ④
println("员工\(name) 已经析构成功。")⑤
}
}
var ref1: Employee? ⑥
var ref2: Employee? ⑦
var ref3: Employee? ⑧
ref1 = Employee(no: 7698, name: "Blake", job :"Salesman", salary : 1600) ⑨
ref2 = ref1 ⑩
ref3 = ref1 ⑪
ref1 = nil ⑫
ref2 = nil ⑬
ref3 = nil ⑭
import Cocoa
var str = "Hello, playground"
class Employee
var no : Int
var name : String
var job : String
var salary : Double
init(no : Int, name:String,job : String, salary :Double) {
self.no = no
self.name = name
self.job = job
self.salary = salary
println("员工\(name)已经构建成功. ")
}
deinit {
println("员工\(name)已经构建成功. ")
}
var ref1: Employee?
var ref2: Employee?
var ref3: Employee?
ref1 = Employee(no:7698, name: "Black" , job :"Salesman", salary : 1600)
ref2 = ref1
ref3 = ref1
ref2 = nil
ref1 = nil
ref3 = nil
上述代码第①行声明了Employee类,第②行代码是定义构造器,在构造器中初始化存储属性,并且在代码第③行输出构造成功信息。第④行代码是定义析构器,并在代码第⑤行输出析构成功信息。
代码第⑥~⑧行是声明3个Employee类型变量,这个时候还没有创建Employee对象分配内存空间。代码第⑨行是真正创建Employee对象分配内存空间,并把对象的引用分配给ref1变量,ref1与对象建立“强引用”关系,“强引用”关系能够保证对象在内存中不被释放,这时候它的引用计数是1。第⑩行代码ref2 = ref1是将对象的引用分配给ref2,ref2也与对象建立“强引用”关系,这时候它的引用计数是2。第⑪行代码ref3 = ref1是将对象的引用分配给ref3,ref3也与对象建立“强引用”关系,这时候它的引用计数是3。
然后在代码第⑫行通过ref1 = nil语句断开ref1对Employee对象的引用,这时候它的引用计数是2。以此类推,ref2 = nil时它的引用计数是1,ref3 = nil时它的引用计数是0,当引用计数为0的时候Employee对象被释放。
我们可以测试一下看看效果,如果设置断点单步调试,会发现代码运行完第⑨行后控制台输出:
员工Blake 已经构造成功。
析构器输出的内容直到运行完第⑭行代码才输出:
员工Blake 已经析构成功。
这说明只有在引用计数为0的情况下才调用析构器,释放对象。
- Swift内存管理-示例讲解
- [Swift内存管理-示例讲解]
- Swift内存管理-示例讲解
- Swift-内存管理
- swift 内存管理
- Swift中的内存管理
- Swift中的内存管理
- swift - 内存管理
- swift - 内存管理
- Swift OC 内存管理
- Swift--15内存管理
- Swift中的内存管理
- Swift内存管理(ARC)
- Swift 基础学习(内存管理)
- Swift 中的内存管理详解
- 14.3 Swift内存管理模型
- Swift中如何管理内存?
- OpenStack云管理系统:Swift讲解
- iOS 下载图片前如何预取图片的大小
- iOS开发UI篇—Quartz2D使用(信纸条纹)
- 字典树小结
- chromium issues
- java环境配置为1.7jdk为什么cmd java -version查看版本是1.8||win7 java(tm) platform se binary 已停止工作 出现了一个问题,导致程序停止正常
- [Swift内存管理-示例讲解]
- ZOJ Problem Set - 1006 Do the Untwist
- Xcode 版本升级常见错误及警告
- js循环。for,each
- 相似度计算
- iOS开发UI篇—Quartz2D使用(截屏)
- 如何在类的外部修改类中的私有数据成员
- CSS Sprites技术
- 虚拟机VMware与主机共享文件介绍