【问题标题】:Swift Method: deinit is not invokedSwift 方法:不调用 deinit
【发布时间】:2015-04-13 00:38:12
【问题描述】:

这是来自 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 方法。为什么?

【问题讨论】:

  • 这是正常的,以防您使用游乐场,因为那里的内存管理工作有点不同。您是否尝试过编译的应用程序?
  • 对@Kirsteins,它在编译的应用程序中正常工作,但在操场上却不行。

标签: swift deinit


【解决方案1】:

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

在最新的 Xcode 测试版 (6.3) 中,即使在操场上,此代码也可以正常工作。

【讨论】:

    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 2014-08-13
    • 2018-08-13
    • 2015-08-25
    • 2015-10-21
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多