析構(gòu)器只適用于類型浊吏,當(dāng)一個(gè)類的實(shí)例被釋放之前掀序,析構(gòu)器會被立即調(diào)用帆焕。析構(gòu)器用關(guān)鍵字deinit
來標(biāo)示,類似于構(gòu)造器要用init
標(biāo)示。
1. 析構(gòu)過程原理
在類的定義中叶雹,每個(gè)類最多只有一個(gè)析構(gòu)器财饥,而且析構(gòu)器不帶任何參數(shù)。
deinit {
// 執(zhí)行析構(gòu)過程
}
析構(gòu)器是在實(shí)例釋放發(fā)生前被自動調(diào)用折晦,你不能主動調(diào)用析構(gòu)器钥星。
因?yàn)橹钡綄?shí)例的析構(gòu)器被調(diào)用后,實(shí)例才會被釋放满着,所以析構(gòu)器可以訪問實(shí)例的所有屬性谦炒。
2. 析構(gòu)器實(shí)踐
class Bank {
static var coinsInBank = 10000
static func distribute(coins numberOfCoinsRequested: Int) -> Int {
let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
coinsInBank -= numberOfCoinsToVend
return numberOfCoinsToVend
}
static func receive(coins: Int) {
coinsInBank += coins
}
}
class Player {
var coinsInPurse: Int
init(coins: Int) {
coinsInPurse = Bank.distribute(coins: coins)
}
func win(coins: Int) {
coinsInPurse += Bank.distribute(coins: coins)
}
deinit {
Bank.receive(coins: coinsInPurse)
}
}
var playerOne: Player? = Player(coins: 100)
playerOne!.win(coins: 2000)
playerOne = nil
print("The bank now has \(Bank.coinsInBank) coins")
// The bank now has 10000 coins
在這里,析構(gòu)器的作用只是將玩家的所有硬幣都返給Bank
對象风喇。
playOne = nil
意味著沒有Player
實(shí)例宁改,因此該實(shí)例會被釋放,以便回收內(nèi)存魂莫。在這之前还蹲,該實(shí)例的析構(gòu)器被自動調(diào)用,玩家的硬幣被返給銀行豁鲤。