我在阅读The Swift Programming Language guide时遇到了一个名为deinit()
的函数,但我仍然想知道为什么以及何时需要实现它,因为我们不需要管理内存。
答案 0 :(得分:33)
您不需要实现该方法,但如果您需要在取消分配对象之前执行某些操作或清理,则可以使用它。
Apple docs包含一个示例:
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)
}
}
因此,每当玩家从游戏中移除时,其硬币将被返还给银行。
答案 1 :(得分:3)
如果您的类管理文件句柄或其他资源,您可以在deinit中关闭该句柄,以确保在释放该对象后它不会继续存在。
答案 2 :(得分:3)
在取消分配类实例之前立即调用deinitilizer,当您使用自己的资源时它会很有用。例如如果您创建自定义类来打开文件并向其写入一些数据,则可能需要在取消分配类实例之前关闭文件。最重要的是类定义每个类最多只能有一个deintilizer
答案 3 :(得分:1)
在取消分配类实例之前立即调用deinitializer。您使用deinit关键字编写deinitializers,类似于使用init关键字编写初始化程序的方式。 Deinitializers仅适用于类类型。类定义每个类最多只能有一个deinitializer。 deinitializer不带任何参数,并且没有括号。 我使用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)
}
答案 4 :(得分:0)
如果要在某个对象中创建大量操作,需要按照自己的步调取消分配,可以在deinit
答案 5 :(得分:0)
,自动调用removeObserver。
答案 6 :(得分:0)
“最佳答案”现在应该看起来更像这样
<块引用>我无法编辑它
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