归零弱变量首先发生.deinit发生以后.至少在当前的实现中(Xcode 6.1,Swift 1.1)这是观察特定实现的结果,我不知道它是如何由作者实际定义的......如果你有明确的来源,请发表评论或回答.
测试代码在测试时避免使用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
Run Code Online (Sandbox Code Playgroud)
结果:
test() called and a2 is now Optional(weak_deinit_order_comparison.BBB).
deinit called and a2 is now nil.
Run Code Online (Sandbox Code Playgroud)
然后,弱变量nil在deinit被调用之前变为.
这种预先填充同样适用于unowned对象.无主的对象将无法访问在该点deist一样weak,和审判在访问无主的对象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
Run Code Online (Sandbox Code Playgroud)
没有看文档,也没有实现......
只有一个订单才有意义:nilling必须先行.
如果在禁用弱引用之前就开始取消初始化,ARC将遭受旧的复活问题(保留正在被解除分配的对象).事实并非如此.
这是我对象破坏的心理模型(同样,不是来自文档,这可能与现实世界不同):
deinit 调用链,可能调用objc基类dealloc对于可能对对象进行新的强引用的其他线程,步骤1到4以原子方式发生.
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |