Swift方法:不调用deinit

时间:2015-03-24 13:23:02

标签: swift deinit

以下是Apple的Swift Programming Book(在章节:Deinitializers中)的代码示例

struct Bank {
    static var coinsInBank = 10_000
    static func vendCoins(coins: Int)-> Int {
        var coinsToVend = min(coins, coinsInBank)
        coinsInBank -= coinsToVend
        return coinsToVend
    }
    static func receiveCoins(coins: Int){
        coinsInBank += coins
    }
}

class MyPlayer {
    var coinsInPurse: Int
    init(coins: Int){
        coinsInPurse = Bank.vendCoins(coins)
    }
    func winCoins(coins: Int){
        coinsInPurse += Bank.vendCoins(coins)
    }
    deinit {
        Bank.receiveCoins(coinsInPurse)
        println("Bank has \(Bank.coinsInBank) coins")
    }
}

var playerOne: MyPlayer? = MyPlayer(coins: 250)
playerOne?.winCoins(100)
println("PlayerOne has \(playerOne!.coinsInPurse) coins")
println("Bank has \(Bank.coinsInBank) coins")
playerOne = nil
println("Bank has \(Bank.coinsInBank) coins")  //This prints 9650
                                               //instead of 10000

似乎没有调用deinit方法。为什么呢?

1 个答案:

答案 0 :(得分:1)

如果您在Xcode 6.1(可能是6.2,我没有安装)游乐场中尝试此操作,您会看到这种行为,因为游乐场有时会做额外的保留而您不知道的。如果您将此代码粘贴到6.1.1中的刮刮Swift控制台应用程序中,它可以正常工作并打印10000。

在最新的Xcode测试版(6.3)中,即使在游乐场中,此代码也能按预期工作。