一、導(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ù)