天天看點

三十一 Swift5.0之 析構方法

/*
析構方法
對象的記憶體被回收前夕被隐式調用的方法, 對應OC的dealloc方法
主要執行一些額外操作, 例如釋放一些持有資源, 關閉檔案, 斷開網絡等
*/

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/Jonathan_Lee/Desktop/老員工獎.xlsx")
// 當對象沒有任何強引用時會被銷毀
fh = nil




/*
析構方法的自動繼承
父類的析構方法會被自動調用, 不需要子類管理
*/
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: "gezi")
        print("SuperMan init")
    }
    deinit{
        // 如果父類的析構方法不會被自動調用,那麼我們還需要關心父類
        // 但是如果這樣做對子類是比較痛苦的
        print("SuperMan deinit")
    }
}
var sm: SuperMan? = SuperMan(age: 30)
sm = nil