【发布时间】:2021-11-14 13:24:23
【问题描述】:
class A {
var b: B
init(b: B) {
self.b = b
}
deinit {
print(" Destroying A")
}
}
class B {
weak var a: A?
deinit {
print(" Destroying B")
}
}
func setup(_ a: inout A?, _ b: inout B?) {
b = B()
a = A(b: b!)
b?.a = a
}
var bravo: B?
var alpha: A?
setup(&alpha, &bravo)
bravo = nil
alpha = nil
// OUTPUT:
// " Destroying A"
// " Destroying B"
我已经尝试了将 alpha 和 bravo 设置为 nil 的所有排列,但我无法在 alpha 之前让 bravo 取消初始化。根据我在 Swift Playgrounds 中的简短实验,alpha 总是在 bravo 之前得到 deinit。谁能解释一下原因?
我知道这与ARC有关,但我想如果bravo = nil,那么alpha.b的值不也是nil吗?如果是这样,那么在 alpha 之前安全地 deinit bravo 不安全吗?
我很想知道随着时间的推移,每个实例的保留计数是多少。
【问题讨论】:
-
你不能在 Playgrounds 中测试这些东西。 Playgrounds 环境有自己对对象的引用,以便显示右侧排水沟。如果您想探索它,请在命令行应用程序中探索它。
标签: swift automatic-ref-counting retaincount