NSManagedObjectContext Child/Parent - Child 不删除 registeredObjects

NSManagedObjectContext Child/Parent - Child not removing registeredObjects

我有 2 个 NSManagedObject 上下文,一个是临时的,另一个是主要的。临时上下文将其 parent 上下文设置为主上下文。我在以下情况下同时使用它们:

在这些情况下,似乎一切正常。保存后,临时上下文报告它有 0 个注册的 objects,主上下文有一个额外的 object.

但是,有一种情况是创建 "new" object 包括另一个 object,它与这个新的 object 有关系。因此,对于这个 object,我创建了新的 object,创建了 "child" object,并将其设置在 parent 上。所以有 2 个 NSManagedObjects。我以相同的方式执行 "save" - 保存临时上下文,然后保存主上下文。问题是我的临时上下文在保存完成后仍然声明它有 2 个注册的 objects。主要object也说它有2个,它们都显示正确。

我可以通过在对临时上下文执行 "save" 之后对临时上下文执行 "reset" 来解决这个问题。然而,这似乎不对。为什么我必须这样做?为什么我的临时上下文在执行保存后仍然报告已注册 objects?

编辑:我还可以通过在对临时上下文执行保存后对临时上下文的 object 执行 "refreshObject:object mergeChanges:NO" 来解决此问题。这似乎是目前 最好的 解决方案(直到有人可以解释为什么我需要这样做或为什么会发生这种情况)。我的猜测是 object 互相引用,这导致 object 不释放。

为什么要考虑注册对象的数量?注册对象只是上下文知道的对象列表。由于该上下文创建了这些对象,因此即使在保存之后,它也自然会继续知道它们。 Core Data 不会在保存后清除对象。

我读到它正在按预期工作。

当你对MOC执行保存操作时,它会将对象保存到持久化存储的父MOC中。但是对象仍然会被MOC保留在内存中。

默认情况下,托管对象与其上下文之间的引用是弱引用。此规则的例外是托管对象上下文维护对任何已更改(插入、删除和更新)对象的强引用,直到未决事务被提交(使用保存:)或丢弃(使用重置或回滚)。

如果您觉得此对象不再需要为当前的未来填满或生成警报(在内存存储中即时),您希望 trim 通过将所有内容转换为图形对象使用 "refreshObject:object mergeChanges:NO"

的错误