在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"
我不知道代码是否没有正确地取消初始化。
答案 0 :(得分:0)
简答:不。
关于ARC:
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况。在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理。当不再需要这些实例时,ARC会自动释放类实例使用的内存。
关于Deinitializers:
在实例解除分配之前,会自动调用取消初始化。您不能自己致电deinitializer。超类deinitializers由其子类继承,超类deinitializer在子类deinitializer实现的末尾自动调用。即使子类不提供自己的deinitializer,也始终调用超类deinitializers。 用简单的英语:
您不能依赖 ARC 来同步取消分配对象。将计数减少到0并不等于 C ++ free()
。