一非驮、導(dǎo)入
構(gòu)造函數(shù)式從無(wú)到有,誕生的過(guò)程
析構(gòu)函數(shù)相反雏赦,從有到無(wú)劫笙,也就是死亡的時(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)存泄露問(wèn)題
三允华、deinit運(yùn)行原理圈浇,涉及兩個(gè)問(wèn)題,請(qǐng)大家思考:
1靴寂、怎么判斷什么時(shí)候不再需要一個(gè)實(shí)例了磷蜀?怎么知道我什么時(shí)候去回收,什么時(shí)候不回收百炬?
2褐隆、如何實(shí)現(xiàn)自動(dòng)釋放?
實(shí)現(xiàn):
Swift 通過(guò)自動(dòng)引用計(jì)數(shù)(ARC)處理實(shí)例的內(nèi)存管理-有人用,我就不回收剖踊;沒(mé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ù)