- Swift 教程
- Swift - 首页
- Swift - 概述
- Swift - 环境
- Swift - 基本语法
- Swift - 变量
- Swift - 常量
- Swift - 字面量
- Swift - 注释
- Swift 运算符
- Swift - 运算符
- Swift - 算术运算符
- Swift - 比较运算符
- Swift - 逻辑运算符
- Swift - 赋值运算符
- Swift - 位运算符
- Swift - 其他运算符
- Swift 高级运算符
- Swift - 运算符重载
- Swift - 算术溢出运算符
- Swift - 恒等运算符
- Swift - 范围运算符
- Swift 数据类型
- Swift - 数据类型
- Swift - 整数
- Swift - 浮点数
- Swift - Double
- Swift - 布尔值
- Swift - 字符串
- Swift - 字符
- Swift - 类型别名
- Swift - 可选值
- Swift - 元组
- Swift - 断言和前提条件
- Swift 控制流
- Swift - 决策
- Swift - if 语句
- Swift - if...else if...else 语句
- Swift - if-else 语句
- Swift - 嵌套 if 语句
- Swift - switch 语句
- Swift - 循环
- Swift - for in 循环
- Swift - while 循环
- Swift - repeat...while 循环
- Swift - continue 语句
- Swift - break 语句
- Swift - fallthrough 语句
- Swift 集合
- Swift - 数组
- Swift - 集合
- Swift - 字典
- Swift 函数
- Swift - 函数
- Swift - 嵌套函数
- Swift - 函数重载
- Swift - 递归
- Swift - 高阶函数
- Swift 闭包
- Swift - 闭包
- Swift - 转义和非转义闭包
- Swift - 自动闭包
- Swift 面向对象编程
- Swift - 枚举
- Swift - 结构体
- Swift - 类
- Swift - 属性
- Swift - 方法
- Swift - 下标
- Swift - 继承
- Swift - 重写
- Swift - 初始化
- Swift - 析构
- Swift 高级
- Swift - ARC 概述
- Swift - 可选链
- Swift - 错误处理
- Swift - 并发
- Swift - 类型转换
- Swift - 嵌套类型
- Swift - 扩展
- Swift - 协议
- Swift - 泛型
- Swift - 访问控制
- Swift - 函数与方法
- Swift - SwiftyJSON
- Swift - 单例类
- Swift 随机数
- Swift 不透明类型和装箱类型
- Swift 有用资源
- Swift - 在线编译
- Swift - 快速指南
- Swift - 有用资源
- Swift - 讨论
Swift - 析构
析构是释放类实例不再需要时内存资源的过程。析构器仅适用于类,不适用于结构体或枚举。Swift 不会立即在实例不再需要时调用析构器,而是在实例被释放之前调用它,这个时机由自动引用计数 (ARC) 系统管理。
一个类只能有一个析构器。
析构器是自动调用的,开发者不允许手动调用它们。
析构器的调用时机不是由开发者显式控制的,而是由 ARC 自动确定的。
循环引用可能会阻止析构。
超类的析构器会被其子类继承,并且超类的析构器会在子类析构器的实现之后调用(即使子类没有自己的析构器)。
众所周知,实例只有在其析构器被调用后才会被释放,这意味着析构器可以访问和修改实例的属性。
在类中定义析构器
在 Swift 中,我们可以在类中使用“deinit”关键字定义析构器。析构器中的代码将在类的实例被释放时执行。析构器不接受任何参数。
语法
以下是析构器的语法
class className{ // Properties and methods of class // Deinitializer deinit { // statement } }
示例
创建析构器的 Swift 程序。
// Defining class class Student { // Property of class var name: String // Initializer to initialize instance init(name: String) { self.name = name print("\(name) is initialized") } // Deinitializer to deinitialize instance deinit { print("\(name) is deinitialized") } } // Creating and initializing instances of the student class var object1: Student? = Student(name: "Mira") var object2: Student? = Student(name: "Jenni") // Deinitializers will be called when instances are deallocated object1 = nil object2 = nil
输出
它将产生以下输出:
Mira is initialized Jenni is initialized Mira is deinitialized Jenni is deinitialized
使用析构器释放内存空间
在 Swift 中,析构由自动引用计数 (ARC) 处理。自动引用计数是一种内存管理机制,用于跟踪实例引用并在不再需要对象时释放它们。尽管 Swift 自动释放内存资源,我们不需要执行手动清理,但如果我们正在使用自己的资源,那么我们可能需要手动清理它们。例如,如果我们创建一个自定义类来打开文件并向其中写入一些数据,我们可能需要在类实例被释放之前关闭文件。
现在,我们将看到析构器是如何工作的:
步骤 1 - 使用“init”初始化器创建并初始化类的新的实例。
步骤 2 - 使用具有强引用的类的实例。只要至少有一个强引用指向该对象,类的实例就会保持活动状态。
步骤 3 - 当对对象的最后一个强引用终止时,ARC 将在对象被释放之前自动调用析构器。
步骤 4 - 现在执行析构器中的代码,并且给定类的实例将被释放。内存可供其他对象使用。
这就是析构器的工作方式。
示例
演示析构器如何工作的 Swift 程序。
var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() print(counter) print = nil print(counter)
输出
它将产生以下输出:
1 0
当省略print = nil语句时,计数器的值保持不变,因为它没有被析构。
示例
var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() print(counter) print(counter)
输出
它将产生以下输出:
1 1