1. 析构函数基本概念
对象的内存被回收前夕被隐式调用的方法, 对应OC的
dealloc
方法主要执行一些额外操作, 例如释放一些持有资源, 关闭文件, 断开网络, 移除通知监听者等
-
Swift 会自动释放不再需要的实例以释放资源
- Swift 通过自动引用计数(ARC)处理实例的内存管理
- 当引用计数为0时,系统会自动调用析构函数(不可以手动调用)
-
**注意: **
- 需要手动将一个对象释放, 则只要将其指向
nil
就可 - 指向
nil
表示没有了强引用, 然而在 Swift 中nil
也是一个类, - 因此在定义对象的时候, 必须定义是变量
var
, 并且是可选类型?
, 只有可选类型才可以赋值为nil
- 需要手动将一个对象释放, 则只要将其指向
析构函数的写法
deinit {
// 执行析构过程
}
- 示例
class Person {
var name : String
var age : Int
init(name : String, age : Int) {
self.name = name
self.age = age
}
deinit {
print("Person-deinit")
}
}
//指向 nil 表示没有了强引用, 然而在 Swift 中 nil 也是一个类,
//因此在定义对象的时候, 必须定义为变量 var, 并且是可选类型
var p : Person? = Person(name: "cdc", age: 18)
p = nil
// 输出结果: Person-deinit
class FileHandler{
var fd: Int32? //文件描述符
//指定构造器
init(path:String){
//需要打开的文件路径, 打开方式(只读)
//open方法是UNIX的方法
let ret = open(path, O_RDONLY)
if ret == -1{
fd = nil
}else{
fd = ret
}
print("对象被创建")
}
//析构方法
deinit{
//关闭文件
if let ofd = fd{
close(ofd)
}
print("对象被销毁")
}
}
var fh:FileHandler? =
FileHandler(path:"/Users/chendehao/Desktop/chendehao.jpg")
//当对象没有任何强引用时会被销毁
fh = nil
//输出结果:
//对象被创建
//对象被销毁
2. 析构函数的自动继承
- 父类的析构方法会被自动调用, 不需要子类管理
- 析构函数的调用顺序, 实现调用子类, 在调用父类
// 父类
class Person {
var name:String
init(name:String){
self.name = name
print("Person init")
}
deinit{
print("Person deinit")
}
}
// 子类
class SuperMan: Person {
var age:Int
init(age:Int){
self.age = age
super.init(name: "cdh")
print("SuperMan init")
}
deinit{
//如果父类的析构方法不会被自动调用,那么我们还需要关心父类
//但是如果这样做对子类是比较痛苦的
print("SuperMan deinit")
}
}
var sm: SuperMan? = SuperMan(age: 20)
sm = nil
//输出结果:
//Person init // 先是父类被初始话
//SuperMan init // 子类被初始化
//SuperMan deinit // 先是子类被释放
//Person deinit // 父类被释放