看完初始化之後要來看反初始化,有正就有反,有陰就有陽。大家都可以成為,功夫熊貓(X)
反初始化器只適用於 Class 類型,當一個 Class 的實例被釋放之前,反初始化器就會立刻被調用。
反初始化器的標示用 deinit 來標示。
Swift 通常會自動釋放不再需要的實例已釋放資源,也通過 ARC 處理實例的內存管理,通常當實例被釋放時不需要手動去清理。只有在一些情況下需要手動清除,例如,創建了一個自定義的 Class 來打開一個文件,並寫入一些數據,那可能要在那個 Class 實例釋放前手動關閉該文件。
在 Class 定義中每個 Class 只能有一個反初始化器,而且反初始化器不帶任何參數或者圓括弧。
deinit {
}
反初始化器是在實例釋放時會自動調用的,而反初始化器是不能被主動調用的。子類會繼承父類的反初始化器,並且在子類反初始化器觸發後,父類的反初始化器也會被自動調用。即使子類沒有提供自己的反初始化器,父類的反初始化器也會被自動調用。
因為只有反初始化器被調用,實例才會被釋放,所以反初始化器可以訪問實例的所有屬性,並且可以根據屬性修改他的行為。
來看一下官方的例子
class Bank {
static var coinsInBank = 10_000
static func distribute(coins numberOfCoinsRequested: Int) -> Int {
let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
coinsInBank -= numberOfCoinsToVend
return numberOfCoinsToVend
}
static func receive(coins: Int) {
coinsInBank += coins
}
}
這邊先定義了一個 Bank 來做管理虛擬硬幣的機制,然後裡面確保流通的硬幣永遠不會超過 10000 個。
這個 Bank 裡面還有兩個方法 distribute(coins:) 跟 receive(coins:) 來做分發跟收集。
distribute 會在使用的時候先檢查裡面的硬幣是否還足夠,如果不夠的話就會回傳一個比請求時還小的數值。
receive 則是將前回收到 Bank 中。
接下來我們在來定義一個 Player
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)
}
}
Player 裡面定義了 win(coins:) 的方法來獲取 Bank 裡面一定數量的硬幣,並且添加到 Player 身上。而裡面也有一個反初始化器,如果 Player 實例被釋放則會把硬幣全部歸還給 Bank 。
所以實例之後可以有以下操作
playerOne!.win(coins: 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”
好的 今天就先到這裡。