为什么NSManagedObject实例不能强制引用NSManagedObjectContext?

正如在另一个关于SO(和苹果文档 )的问题中指出的那样, NSManagedObject实例并没有强有力的引用它们所源自的NSManagedObjectContext 。 乍一看,这似乎是一个奇怪的决定,因为NSManagedObject实例在没有context几乎是无用的,因为它会导致错误,例如错误,当它们应该时不会触发 。

任何人都可以提供一些背景为什么是这样的情况? 实现NSManagedObject子类会自动拥有对其NSManagedObjectContext的强引用吗?

编辑:感谢伟大的答案这个问题,我发现我的托pipe对象是由RestKit有意临时NSManagedObjectContext创build的。 接下来是我的下一个问题,具体到RestKit, 在这里 。

NSManagedObjectContext拥有它的NSManagedObject比其他方式更有意义。

请记住,上下文就像一个绘图板,其上的所有对象。 如果这种情况消失,对象不再有效。 如果对象拥有上下文,那么上下文将不会对对象产生任何影响,它们似乎仍然是有效的。 换句话说:一个上下文可以存在没有对象,对象不能没有上下文存在。

当然,混合模型(上下文拥有对象和对象自己的上下文)也不起作用,因为那样你就会遇到保留循环。

没有它们的上下文,NSManagedObject实例几乎是无用的

他们可以(虽然不一定),但请记住,他们确实有一个参考他们的背景! 据推测,这是一个薄弱的参考,但参考。 如果该引用返回nil,则该对象无效 。 如果你确定你的上下文停留在哪里(这是我在回答其他问题时所做的),那么你将不会有任何问题。

这是因为你会得到一个保留周期 。 受pipe对象上下文内部使用数组和其他容器,这些容器引用了托pipe对象。

可能的是,这个保留周期不能通过核心数据的内部实现轻易“被明确地破坏”,因此这个引用必须是弱的。