析構(gòu)函數(shù)

一、導(dǎo)入
構(gòu)造函數(shù)式從無到有,誕生的過程
析構(gòu)函數(shù)相反,從有到無,也就是死亡的時(shí)候會(huì)調(diào)用的函數(shù)。

二、定義
每個(gè)類最多只能有一個(gè)析構(gòu)器,而且析構(gòu)器不帶任何參數(shù)和圓括號(hào)
deinit{

}
機(jī)制:Swift 會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)釋放不再需要的實(shí)例以釋放資源
通常在析構(gòu)函數(shù)中釋放一些資源(如移除通知,關(guān)閉文件等操作),幫我們定位內(nèi)存泄露問題

三、deinit運(yùn)行原理,涉及兩個(gè)問題,請(qǐng)大家思考:
1、怎么判斷什么時(shí)候不再需要一個(gè)實(shí)例了?怎么知道我什么時(shí)候去回收,什么時(shí)候不回收?
2、如何實(shí)現(xiàn)自動(dòng)釋放?
實(shí)現(xiàn):
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)用)

class Person {
    var name : String
    var age : Int

    init(name : String, age : Int) {
        print("調(diào)用構(gòu)造函數(shù)")
        self.name = name
        self.age = age
    }

    deinit {
        print("調(diào)用析構(gòu)函數(shù)")
        //釋放資源
    }
}

var p1:Person? = Person(name:"zhangsan",age:18)
var p2:Person? = p1
var p3:Person? = p2
p1 = nil
p2 = nil
p3 = nil//此時(shí)計(jì)數(shù)器為0,調(diào)用析構(gòu)函數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容