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