分配给nil时,自定义可选类不解除分配

时间:2015-07-25 03:13:20

标签: ios swift

在Apple关于Swift的书之后,我遇到了关于deinitializers的问题。本书中的代码构成了一个结构和一个类,结构Bank跟踪硬币(永远不会少于0或超过10,000),而类Player代表一个拥有硬币的玩家银行。

struct Bank
{
    static var coinsInBank = 10_000
    static func vendCoins(var numberOfCoinsToVend: Int) -> Int
    {
        numberOfCoinsToVend = min(numberOfCoinsToVend, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func recieveCoins(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.recieveCoins(coinsInPurse)
    }
}

问题是,当Player类设置为nil时,Apple的书说Swift会自动解除分配。 deinit应该将所有硬币从Player返回到Bank,但不会根据代码测试它:

var playerOne: Player? = Player(coins: 100)
println("A new player has joined the game with \(playerOne!.coinsInPurse) coins") // Prints "A new player has joined the game with 100 coins"

println("There are \(Bank.coinsInBank) coins left in the bank") // Prints "There are 9900 coins left in the bank"

playerOne?.winCoins(2_000)
println("PlayerOne won 2000 coins and now has \(playerOne!.coinsInPurse) coins") // Prints "PlayerOne won 2000 coins and now has 2100 coins"

println("The bank now only has \(Bank.coinsInBank) coins") // Prints "The bank now only has 7900 coins"

playerOne = nil
println("PlayerOne has left the game") // Prints "PlayerOne has left the game"

println("The bank now has \(Bank.coinsInBank) coins") // Prints "The bank now has 7900 coins"

我不知道代码是否没有正确地取消初始化。

1 个答案:

答案 0 :(得分:0)

简答:不。

关于ARC:

  

Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况。在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理。当不再需要这些实例时,ARC会自动释放类实例使用的内存。

关于Deinitializers:

  

在实例解除分配之前,会自动调用取消初始化。您不能自己致电deinitializer。超类deinitializers由其子类继承,超类deinitializer在子类deinitializer实现的末尾自动调用。即使子类不提供自己的deinitializer,也始终调用超类deinitializers。   用简单的英语:

您不能依赖 ARC 来同步取消分配对象。将计数减少到0并不等于 C ++ free()