具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理。而对于值类型,如整型、浮点型、布尔型、字符串、元组、集合、枚举和结构体等,是由处理器自动管理的,程序员不需要管理它们的内存。
一、引用计数
每个Swift类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,称为引用计数(Reference Count,简称RC)。当对象被创建的时候,引用计数为1,每次对象被引用的时候会使其引用计数加1,如果不需要的时候,对象引用断开(赋值为nil),其引用计数减1。当对象的引用计数为0的时候,对象的内存才被释放。
下图是内存引用计数原理示意图。图中的房间就好比是对象的内存,一个人进入房间打开灯,就是创建一个对象,这时候对象的引用计数是1。有人进入房间,引用计数加1;有人离开房间,引用计数减1。最后一个人离开房间,引用计数为0,房间灯关闭,对象内存才被释放。
二、示例:Swift自动引用计数
下面我们通过一个示例了解一下Swift中的自动引用计数原理。下图是Employee类创建的对象的生命周期,该图描述了对象被赋值给3个变量,以及它们的释放过程。
示例代码如下:
- 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 ⑭
上述代码第①行声明了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的情况下才调用析构器,释放对象。
欢迎关注智捷iOS课堂微信公共平台
相关推荐
Swift-Radio-Pro:完整的Swift 2.0的App 开源应用
swift-android-samples, SwiftAndroid工具链示例 SwiftAndroid工具链示例。需要最新的工具链以及 [the Gradle plugin] ( https://github.com/SwiftAndroid/swift-android-gradle ) 。 swifthell
swift-Sample-GitHubSearch-2015, Swift iOS应用的示例代码 Swift 示例应用程序搜索iOS应用程序这个示例应用程序使用了 GitHub搜索 API 。:如何设置使用 rbenv 安装 ruby 解释器:$ rbenv install然后使用 Bundler:...
Swift-Class-Struct Swift-Class-Struct
Leverage the power of protocol-oriented programming in your applications and learn from real-world use cases ...Leverage the power of generics in Swift 4 to create very flexible frameworks
Swift-Daily-Tips:Swift 语法和编程技巧每日提示
Swift 5.10 Date: March 5, 2024 Tag: swift-5.10-RELEASE
Swift-单例Swift-单例Swift-单例Swift-单例Swift-单例
app-development-with-swift-student-guide.ibooks 《app-development-with-swift-student-guide》
swift-5.2.2-RELEASE-ubuntu16.04.tar.gz 第二部分,用于构建vapor在linux所需的环境。国内下载较慢,做个镜像,欢迎大家使用,使用的阿里云ECS
( the-swift-programming-language-swift-4.epub ) ( the-swift-programming-language-swift-4.epub )
Core-ML-Sample 使用Core ML框架和Swift 4的一个示例
Swift和Objective-C混合编程示例代码, 简单实例, 说明地址: http://blog.csdn.net/jabezlee/article/details/40390775
Mems - 用来窥探Swift内存的小工具
开源第三方jar包,SWIFT系统报文解析器,实现对银行SWIFT报文的封装和解析,包含源码。
iOS-CoreML-Yolo在Apple的CoreML框架上使用Tiny YOLO v1模型实现对象检测
Swift-Window-Blur, OSX Yosemite 模糊窗口示例使用 Swift Swift-Window-BlurOSX Yosemite 模糊窗口示例使用新的NSVisualEffectView类。 我在 App Delegate 类中做了它,这样你可以看到代码。 你可以轻松地在接口...
Swift-Package-Manager:Swift软件包管理器示例库
SwiftTrace - 跟踪Swift和Objective-C的方法调用
中文版 Apple 官方 Swift 教程《The Swift Programming Language》