Swift基础语法-类的析构函数


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    // 父类被释放

你可能感兴趣的:(Swift基础语法-类的析构函数)