对 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.mo
和 mo
),相同的测试用例会成功。 mo
的上下文不保留其对象(默认情况下)。
这是怎么回事,为什么弱引用没有自动清零?
是否记录了此行为?
您需要将 mo = nil
更改为 container.mo = nil
。否则引用仍然有效,因为:
- 其他内容引用了
mo
mo
直到当前 运行 循环结束时才释放,此时自动释放池耗尽。如果没有其他引用,那么 container.mo
将是 nil
。
托管对象由 CoreData 缓存。 CoreData 是一个数据库。它确实是高效的。 CoreData 保存对它创建的对象的引用,并在需要时丢弃它们。不是你喜欢的时候。这样它就不必在再次需要时重新创建对象。
弱引用保证在对象消失时被清空。无法保证由 CoreData 维护的托管对象何时消失。
我观察到对 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.mo
和 mo
),相同的测试用例会成功。 mo
的上下文不保留其对象(默认情况下)。
这是怎么回事,为什么弱引用没有自动清零? 是否记录了此行为?
您需要将 mo = nil
更改为 container.mo = nil
。否则引用仍然有效,因为:
- 其他内容引用了
mo
mo
直到当前 运行 循环结束时才释放,此时自动释放池耗尽。如果没有其他引用,那么container.mo
将是nil
。
托管对象由 CoreData 缓存。 CoreData 是一个数据库。它确实是高效的。 CoreData 保存对它创建的对象的引用,并在需要时丢弃它们。不是你喜欢的时候。这样它就不必在再次需要时重新创建对象。
弱引用保证在对象消失时被清空。无法保证由 CoreData 维护的托管对象何时消失。