簡體   English   中英

我應該什么時候使用 deinit?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM