我发现了一件有趣的事情:
class A {
let name = "A"
deinit {
print(self.name)
print(self === Weak.value)
print(Weak.value?.name ?? "nil")
}
}
enum Weak {
static weak var value: A? = nil
}
var a = A()
Weak.value = a
a = A() //to call deinit
输出
A
false
nil
因此,当一个对象执行其deinit方法时,它可以访问自己的属性。但是这个对象的另一个弱引用已经变为零,即使这个对象实际上还没有在此时被释放。
根据This article,每个对象都有一个边桌。这是我的假设:当一个对象的deinit方法正在执行时,该对象尚未被释放。但是从该对象的side-table到此对象的指针已被删除(或标记为nil)。所以没有人可以访问它除了它自己。这实际上是Swift 4的工作原理。
我说的是对的吗?这篇文章不是问题,只是想了解更多细节。如果有人可以解释更多,那就太好了。