对 NSManagedObject 的弱引用不会为零

Weak reference to NSManagedObject doesn't get nil

我观察到对 NSManagedObject 的弱引用的奇怪行为。我有一个对 NSManagedObject 有弱引用的容器:

class Container: NSObject {
    weak var mo: NSManagedObject?
}

假设 mo 是某个 NSManagedObject 我在以下代码中断言失败:

let container = Container()
container.mo = mo
mo = nil
assert(container.mo == nil) // failed

如果我使用 NSObject 而不是 NSManagedObject(container.momo),相同的测试用例会成功。 mo 的上下文不保留其对象(默认情况下)。

这是怎么回事,为什么弱引用没有自动清零? 是否记录了此行为?

您需要将 mo = nil 更改为 container.mo = nil。否则引用仍然有效,因为:

  1. 其他内容引用了 mo
  2. mo 直到当前 运行 循环结束时才释放,此时自动释放池耗尽。如果没有其他引用,那么 container.mo 将是 nil

托管对象由 CoreData 缓存。 CoreData 是一个数据库。它确实是高效的。 CoreData 保存对它创建的对象的引用,并在需要时丢弃它们。不是你喜欢的时候。这样它就不必在再次需要时重新创建对象。

弱引用保证在对象消失时被清空。无法保证由 CoreData 维护的托管对象何时消失。