【发布时间】:2015-05-26 11:32:26
【问题描述】:
我目前正在关注Apple Documentation。这是我的问题:
class Person {
let name: String
init(name: String) {
self.name = name
println("\(name) is being initialized")
}
deinit {
println("\(name) is being deinitialized")
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var reference1: Person?
var reference2: Person?
var reference3: Person?
reference1 = Person(name: "John Appleseed")
// prints "John Appleseed is being initialized
reference2 = reference1
reference3 = reference1
reference1 = nil
reference2 = nil
}
}
在reference1 等于nil 之后,ARC 释放实例并打印"John Appleseed is being deinitialized"
不应该在reference3 = nil之后解除分配吗?
【问题讨论】:
-
@JakubVano 要获取更多信息,我正在 viewDidLoad() 方法中运行此代码。但是 reference3 不是 nil,即使存在强引用,编译器也会释放实例。
-
该屏幕截图添加了混乱,而不是清晰。
-
您如何确定
deinit发生的确切时刻?我希望它在方法返回后立即被调用(绝对不是片刻之后)。由于某种优化,它可能会被提前调用,但在方法返回后它肯定不会闲逛。 -
如果我错了,请纠正我,对 Person 实例有 3 个强引用。我通过将它们设置为 nil 来破坏 2 个引用。但是,仍然有 1 个强参考。编译器如何调用 deinit 方法?
-
因为第三个一旦超出范围就设置为
nil,也就是viewDidLoad方法返回时。
标签: swift automatic-ref-counting