当该对象的deinit正在执行时,Swift弱引用为nil

rib*_*ynn 5 weak-references swift

我发现了一件有趣的事:

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
Run Code Online (Sandbox Code Playgroud)

输出是

A
false
nil
Run Code Online (Sandbox Code Playgroud)

因此,当一个对象执行其deinit方法时,它可以访问自己的属性.但是这个对象的另一个弱引用已经变为零,即使这个对象实际上还没有在此时被释放.

根据这篇文章,每个对象都有一个侧表.这是我的假设:当一个对象的deinit方法正在执行时,该对象尚未被释放.但是从该对象的side-table到此对象的指针已被删除(或标记为nil).所以没有人可以访问它除了它自己.这实际上是Swift 4的工作原理.

我说的是对的吗?这篇文章不是问题,只是想了解更多细节.如果有人可以解释更多,那就太好了.