我什么时候应该使用deinit?

时间:2014-06-03 15:12:25

标签: swift

我在阅读The Swift Programming Language guide时遇到了一个名为deinit()的函数,但我仍然想知道为什么以及何时需要实现它,因为我们不需要管理内存。

7 个答案:

答案 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)

从iOS9

,自动调用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