Swift基礎(chǔ)語法-類的析構(gòu)函數(shù)


1. 析構(gòu)函數(shù)基本概念

  • 對(duì)象的內(nèi)存被回收前夕被隱式調(diào)用的方法, 對(duì)應(yīng)OC的dealloc方法

  • 主要執(zhí)行一些額外操作, 例如釋放一些持有資源, 關(guān)閉文件, 斷開網(wǎng)絡(luò), 移除通知監(jiān)聽者等

  • Swift 會(huì)自動(dòng)釋放不再需要的實(shí)例以釋放資源

    • Swift 通過自動(dòng)引用計(jì)數(shù)(ARC)處理實(shí)例的內(nèi)存管理
    • 當(dāng)引用計(jì)數(shù)為0時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)(不可以手動(dòng)調(diào)用)
  • **注意: **

    • 需要手動(dòng)將一個(gè)對(duì)象釋放, 則只要將其指向nil就可
    • 指向 nil 表示沒有了強(qiáng)引用, 然而在 Swift 中 nil也是一個(gè)類,
    • 因此在定義對(duì)象的時(shí)候, 必須定義是變量var, 并且是可選類型?, 只有可選類型才可以賦值為 nil
  • 析構(gòu)函數(shù)的寫法

deinit {
    // 執(zhí)行析構(gòu)過程
}
  • 示例
class Person {
    var name : String
    var age : Int

    init(name : String, age : Int) {
        self.name = name
        self.age = age
    }

    deinit {
        print("Person-deinit")
    }
}
//指向 nil 表示沒有了強(qiáng)引用, 然而在 Swift 中 nil 也是一個(gè)類, 
//因此在定義對(duì)象的時(shí)候, 必須定義為變量 var, 并且是可選類型
var p : Person? = Person(name: "cdc", age: 18)
p = nil
// 輸出結(jié)果:  Person-deinit
class FileHandler{
    var fd: Int32?  //文件描述符
    //指定構(gòu)造器
    init(path:String){
        //需要打開的文件路徑, 打開方式(只讀)
        //open方法是UNIX的方法
        let ret = open(path, O_RDONLY)
        if ret == -1{
            fd = nil
        }else{
            fd = ret
        }
        print("對(duì)象被創(chuàng)建")
    }
    //析構(gòu)方法
    deinit{
        //關(guān)閉文件
        if let ofd = fd{
            close(ofd)
        }
        print("對(duì)象被銷毀")
    }
}
var fh:FileHandler? =
    FileHandler(path:"/Users/chendehao/Desktop/chendehao.jpg")
//當(dāng)對(duì)象沒有任何強(qiáng)引用時(shí)會(huì)被銷毀
fh = nil
//輸出結(jié)果:
//對(duì)象被創(chuàng)建
//對(duì)象被銷毀

2. 析構(gòu)函數(shù)的自動(dòng)繼承

  • 父類的析構(gòu)方法會(huì)被自動(dòng)調(diào)用, 不需要子類管理
  • 析構(gòu)函數(shù)的調(diào)用順序, 實(shí)現(xiàn)調(diào)用子類, 在調(diào)用父類
// 父類
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{
        //如果父類的析構(gòu)方法不會(huì)被自動(dòng)調(diào)用,那么我們還需要關(guān)心父類
        //但是如果這樣做對(duì)子類是比較痛苦的
        print("SuperMan deinit")
    }
}
var sm: SuperMan? = SuperMan(age: 20)
sm = nil
//輸出結(jié)果:
//Person init      // 先是父類被初始話
//SuperMan init    // 子類被初始化
//SuperMan deinit  // 先是子類被釋放
//Person deinit    // 父類被釋放
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容