[英]When should I use deinit?
我在閱讀The Swift Programming Language guide時遇到了一個名為deinit()
的函數,但我仍然想知道為什么以及何時需要實現它,因為我們實際上並不需要管理內存。
不需要您實現該方法,但如果您需要在釋放對象之前執行某些操作或清理,則可以使用它。
Apple 文檔包括一個示例:
struct Bank {
static var coinsInBank = 10_000
static func vendCoins(var numberOfCoinsToVend: Int) -> Int {
numberOfCoinsToVend = min(numberOfCoinsToVend, 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)
}
}
因此,每當玩家被從游戲中移除時,其硬幣就會返還給銀行。
在釋放類實例之前立即調用deinit()
,這在您使用自己的資源時很有幫助。 例如,如果您創建一個自定義類來打開一個文件並向其中寫入一些數據,您可能需要在釋放類實例之前關閉該文件。 要記住的最重要的事情是一個類定義每個類最多可以有一個deinit()
從 iOS9 開始,removeObserver 被自動調用。
如果您的類管理文件句柄或不同的資源,您可以在 deinit 中關閉該句柄,以確保在釋放對象后它不會繼續存在。
在釋放類實例之前立即調用析構器。 使用 deinit 關鍵字編寫析構器,類似於使用 init 關鍵字編寫初始化器的方式。 析構器僅適用於類類型。類定義每個類最多可以有一個析構器。 析構器不接受任何參數,並且不帶括號。 我使用 deinit 從應用程序中刪除通知的觀察者,如下所示。
deinit {
NotificationCenter.default.removeObserver(self, name:
NSNotification.Name(rawValue: "gotoLogin"), object: nil)
NotificationCenter.default.removeObserver(self, name:
NSNotification.Name(rawValue: "gotoMain"), object: nil)
NotificationCenter.default.removeObserver(self, name:
NSNotification.Name(rawValue: "gotoRegister"), object:
nil)
NotificationCenter.default.removeObserver(self, name:
NSNotification.Name(rawValue: "gotoBook"), object: nil)
NotificationCenter.default.removeObserver(self, name:
NSNotification.Name(rawValue: "gotoCurrentMainMenu"),
object: nil)
NotificationCenter.default.removeObserver(self, name:
NSNotification.Name(rawValue: "gotoEventMenu"),
object: nil)
}
如果您在某個需要按照您的節奏釋放的對象中創建大量操作,您可以在deinit
執行此deinit
“最佳答案”現在應該看起來更像這樣
我無法編輯它
struct Bank {
static var coinsInBank = 10000
static func vendCoins(money numberOfCoinsToVend: Int) -> Int {
let CoinsToVend = min(numberOfCoinsToVend, coinsInBank)
coinsInBank -= CoinsToVend
return CoinsToVend
}
static func receiveCoins(coins: Int) {
coinsInBank += coins
}
}
class Player {
var coinsInPurse: Int
init(coins: Int) {
coinsInPurse = Bank.vendCoins(money:coins)
}
func winCoins(coins: Int) {
coinsInPurse += Bank.vendCoins(money:coins)
}
deinit {
Bank.receiveCoins(coins:coinsInPurse)
}
}
print("Balance in Account: \(Bank.coinsInBank)")
var Player1: Player? = Player(coins: 9000)
print("Requested Amount to Withdraw: \(Player1!.coinsInPurse)")
print("Balance After Withdraw: \(Bank.coinsInBank)")
Player1 = nil
print("Balance in Account: \(Bank.coinsInBank)")
輸出應該是這樣的
賬戶余額:10000 請求提款金額:9000 提款后余額:1000 賬戶余額:10000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.