哪个先发生?
- 清零(nilling)弱变量。
deinit
清零弱变量首先发生。deinit
稍后发生。至少在当前的实现中(Xcode 6.1,Swift 1.1)这是观察具体实现的结果,我不知道作者实际上是如何定义的......如果您有明确的来源,请评论或回答。
ADC论坛也有相关讨论。
测试代码在测试时避免使用 Playground 以获得正确的生命周期行为。
class AAA {
func test() {
}
}
var a1 = nil as AAA?
weak var a2 = nil as AAA?
class BBB: AAA {
var data = "Here be dragons."
override func test() {
println("test() called and a2 is now \(a2).")
}
deinit {
println("deinit called and a2 is now \(a2).")
}
}
a1 = BBB()
a2 = a1
a2!.test()
a1 = nil
结果:
test() called and a2 is now Optional(weak_deinit_order_comparison.BBB).
deinit called and a2 is now nil.
然后,弱变量在被调用nil
之前变为。deinit
这种预填充同样适用于unowned
对象。deist
Unowned 对象将在就像点变得不可访问weak
,并且尝试访问 unowned 对象deinit
将使应用程序崩溃。
如果您分配self
给 中的weak var
变量deinit
,它将nil
立即变为。(Xcode 版本 6.3.2 (6D2105))
class Foo {
init() {
}
deinit {
var a = self
weak var b = self
unowned var c = self
let d = Unmanaged.passUnretained(self)
println(a) // prints `Foo`.
println(b) // prints `nil`.
// println(c) // crashes.
println(d.takeUnretainedValue()) // prints `Foo`.
}
}
var f = Foo() as Foo?
f = nil
不看文档,也不看实现......
只有一个顺序是有意义的:nilling 必须是第一位的。
如果在取消弱引用之前开始取消初始化,ARC 将遭受旧的复活问题(保留正在被释放的对象)。事实并非如此。
这是我的对象破坏心智模型(同样,不是来自文档,这可能与现实世界不同):
deinit
调用chain,可能调用objc基类dealloc步骤 1 到 4 以原子方式发生,其他线程可能会对该对象进行新的强引用。