Swift 当该对象';Denit正在执行

Swift 当该对象';Denit正在执行,swift,weak-references,Swift,Weak References,我发现了一件有趣的事: 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 输

我发现了一件有趣的事:

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方法时,它可以访问自己的属性。但是对这个对象的另一个弱引用变成了零,即使这个对象在此时实际上还没有被释放

根据,每个对象都有一个侧桌。我的假设是:当一个对象的deinit方法正在执行时,这个对象还没有被释放。但是从这个对象的边表指向这个对象的指针已经被删除(或者标记为nil)。所以除了它自己,没有人可以访问它。这就是Swift 4的工作原理


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

对于这里研究的Objective-C:。打印
弱值
,而不是
名称
@user1046037相同的结果。这不重要。顺便说一句,我正在实现观测者模式,实际上,我需要观测者可以从主题中的观测者数组中移除自己,该数组保持对观测者的弱引用。它需要像self===Weak.value这样的东西,但它不起作用。但我用另一种方法解决了这个问题。@Martiner它是。。。对于我来说,现在阅读堆栈回溯或完全理解objc系统有些困难。应该多学解释:P谢谢你的回复!