Swift 方法:未调用 deinit
Swift Method: deinit is not invoked
这是来自 Swift Apple 编程书籍的代码示例(在章节: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 方法。为什么?
如果您在 Xcode 6.1(也可能是 6.2,我没有安装它)playground 中尝试此操作,您会看到此行为,因为 playground 有时会执行您不知道的额外保留的。如果您将此代码粘贴到 6.1.1 中的临时 Swift 控制台应用程序,它可以正常工作并打印 10000.
在最新的 Xcode 测试版 (6.3) 中,此代码即使在操场上也能按预期工作。
这是来自 Swift Apple 编程书籍的代码示例(在章节: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 方法。为什么?
如果您在 Xcode 6.1(也可能是 6.2,我没有安装它)playground 中尝试此操作,您会看到此行为,因为 playground 有时会执行您不知道的额外保留的。如果您将此代码粘贴到 6.1.1 中的临时 Swift 控制台应用程序,它可以正常工作并打印 10000.
在最新的 Xcode 测试版 (6.3) 中,此代码即使在操场上也能按预期工作。