- 析構器只適用于類類型,當一個類的實例被釋放之前,析構器會被立即調用。析構器用關鍵字deinit來標示。
析構過程原理(How Deinitialization Works)
Swift 會自動釋放不再需要的實例以釋放資源。
在類的定義中,每個類最多只能有一個析構器,而且析構器不帶任何參數。
析構器是在實例釋放發生前被自動調用。
不能主動調用析構器。
子類繼承了父類的析構器,并且在子類析構器實現的最后,父類的析構器會被自動調用。
因為直到實例的析構器被調用后,實例才會被釋放,所以析構器可以訪問實例的所有屬性,并且可以根據那些屬性可以修改它的行為(比如查找一個需要被關閉的文件)。
class Bank {
static var coinsInBank = 10_000
static func vendCoins(numberOfCoinsRequested: Int) -> Int {
let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
coinsInBank -= numberOfCoinsToVend
return numberOfCoinsToVend
}
static func receiveCoins(coins: Int) {
coinsInBank += coins
}
}
class Player {
var coinsInPurse: Int
init(coins: Int) {
coinsInPurse = Bank.vendCoins(coins)
}
func winCoins(coins: Int) {
coinsInPurse += Bank.vendCoins(coins)
}
deinit {
Bank.receiveCoins(coinsInPurse)
}
}
var playerOne: Player? = Player(coins: 100)
print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
// 打印 "A new player has joined the game with 100 coins"
print("There are now \(Bank.coinsInBank) coins left in the bank")
// 打印 "There are now 9900 coins left in the bank"
playerOne!.winCoins(2_000)
print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// 輸出 "PlayerOne won 2000 coins & now has 2100 coins"
print("The bank now only has \(Bank.coinsInBank) coins left")
// 輸出 "The bank now only has 7900 coins left"
playerOne = nil
print("PlayerOne has left the game")
// 打印 "PlayerOne has left the game"
print("The bank now has \(Bank.coinsInBank) coins")
// 打印 "The bank now has 10000 coins"