Swift ARC 自动引用计数
2024-09-13 23:33:04
1、ARC
引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0,此时系统会自动释放实例所占用的内存空间,一旦释放就不能再访问这个实例的属性和方法。由于该过程是自动的,不需要开发人员来开辟和释放内存,因此称为自动引用计数,简称 ARC(Automatic Reference Counting)。
- 为了避免使用中的实例被释放,ARC 会跟踪并计算每一个实例被多少属性、常量和变量所引用。
- 引用有强引用和弱引用之分,这是为了保证在某些循环引用的情况下可以打破循环。
- 为了保证实例在被属性、常量和变量引用时不会被意外释放,引用默认情况下会被设定为强引用。
1.1 ARC 示例
在构造器和析构器中分别写一个打印语句,用来标示实例的创建和销毁。
class Student { var name: String
var age: Int init(name: String, age: Int) {
self.name = name
self.age = age print("创建了一个实例")
} deinit { print("销毁了一个实例")
}
}
声明两个变量,把它们的类型声明为
Student
的可选型,现在它们还没有被赋值。var xiaoming: Student?
var xiaogang: Student?
通过构造器创建一个
Student
的实例,然后把这个实例赋值给第一个变量。xiaoming = Student(name: "xiaoming", age: 12)
此时运行程序输出如下。
创建了一个实例
这次让第二个变量也引用这个实例,现在这个实例的引用计数为 2,代表着
Student
实例的内存地址被引用了两次。xiaogang = xiaoming
下面通过给变量赋值
nil
来断开引用,首先断开一个变量的引用,现在Student
实例的引用计数已变为 1。xiaogang = nil
接着断开第二个变量的引用,现在没有任何属性或者变量引用这个实例了。
xiaoming = nil
可以看到中控台打印信息如下,这个类调用了析构器,代表它被销毁了,释放出了实例所占用的内存空间。
销毁了一个实例
看起来只是引用的数量增减那么简单,不过在真实的内存中,ARC 在检验某个对象的计数时不可避免的需要对堆内存进行加锁和解锁处理,也就是说无论你如何在代码层面优化代码,ARC 本身仍会带来一部分性能的损耗,这也解释了为什么值类型是更好的选择。
最新文章
- CSS4
- github for windows 桌面版使用方法
- sql 参数
- PPP协议总结
- 树形dp专辑
- Influxdb1.2.2安装
- VS2017安装包不占用C盘空间的方法,亲试
- ios监听静音键和音量键事件
- Linux安装JDK(tar)
- C++ 中文拼音排序方法。
- w7 全网架构-rsync-备份
- maven中的各种问题
- C语言进阶之路(三)----野指针的产生原因及解决办法
- Scrum立会报告+燃尽图(十月二十一日总第十二次)
- Docker run 挂载 volume 记录
- 2018-2019第一学期Java助教心得
- Python 的web自动化测试
- day06_04 购物车讲解02
- [BZOJ2738]矩阵乘法 整体二分+二维树状数组
- PM2.5
热门文章
- POJ 2377 Bad Cowtractors (Kruskal)
- Nordic Collegiate Programming Contest NCPC 2017-Problem D-Distinctive Character
- BZOJ1143 [CTSC2008]祭祀river 二分图匹配 最小链覆盖
- 最短路径问题 HDU3790 (dijkstra)
- AndroidStudio 之 Inter x86 Emulator Accelerator(Haxm installer) - not compatible with windows
- iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)
- 前端必备HTTP技能之HTTP请求头响应头中常用字段详解(转)
- BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)
- 洛谷.3374.[模板]树状数组1(CDQ分治)
- crm——stark组件核心原理