Ios NSManagedObjectContext子级/父级-子级未删除registeredObjects

Ios NSManagedObjectContext子级/父级-子级未删除registeredObjects,ios,objective-c,core-data,nsmanagedobject,nsmanagedobjectcontext,Ios,Objective C,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我有两个NSManagedObject上下文,一个是临时上下文,另一个是主上下文。临时上下文的父上下文设置为主上下文。我在以下情况下使用它们: 当我创建一个“新”对象时,我使用临时上下文创建一个新对象。如果用户点击“取消”并决定不创建新对象,我只需从托管对象上下文中删除该对象并保存该上下文 如果用户保存这个新对象,我将保存临时上下文,然后保存主上下文以保存这些更改。我使用“performBlock”方法并链接保存,正如Apple和其他Stackoverflow帖子推荐的那样 如果我正在编辑现有

我有两个NSManagedObject上下文,一个是临时上下文,另一个是主上下文。临时上下文的父上下文设置为主上下文。我在以下情况下使用它们:

  • 当我创建一个“新”对象时,我使用临时上下文创建一个新对象。如果用户点击“取消”并决定不创建新对象,我只需从托管对象上下文中删除该对象并保存该上下文
  • 如果用户保存这个新对象,我将保存临时上下文,然后保存主上下文以保存这些更改。我使用“performBlock”方法并链接保存,正如Apple和其他Stackoverflow帖子推荐的那样
  • 如果我正在编辑现有对象,则在编辑期间将其保留在主上下文中。如果用户点击“取消”,我将在主上下文上调用“回滚”,这将丢弃所有更改
在这些情况下,一切似乎都很好。保存后,临时上下文报告它有0个已注册对象,而主上下文有一个附加对象

但是,在创建“新”对象时,会有一种情况,其中包括与该新对象有关系的另一个对象。因此,对于这个对象,我创建了新对象,创建了“子”对象,并将其设置在父对象上。因此有两个NSManagedObject。我以同样的方式执行“保存”——保存临时上下文,然后保存主上下文。问题是,在保存完成后,我的临时上下文仍然声明它有2个已注册对象。主对象还声明它有2个,并且它们都正确显示

在对临时上下文执行“保存”之后,我可以通过对临时上下文执行“重置”来修复此问题。然而,这似乎并不正确。我为什么要这么做?为什么我的临时上下文即使在执行保存后仍报告已注册的对象


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

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


告诉我它正在按预期工作。

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


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

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


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


如果您觉得当前或将来不再需要此对象已满,或者生成了报警(在内存存储中动态),则在对MOC执行保存操作时,您希望通过使用“refreshObject:object mergeChanges:no”将所有内容转换为故障来修剪图形对象,它将对象保存到持久存储的父MOC。但对象仍将由MOC保留在内存中


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


如果您觉得当前或将来不再需要此对象已满,或者生成了报警(在内存存储中动态生成),则希望通过使用“refreshObject:object mergeChanges:no”将所有内容转换为故障来修剪graph对象。请参见,我不确定这是否是预期的行为。让人觉得有问题的是,即使在对相关对象执行了“删除”操作之后,临时上下文仍在声明它在内存中有这些已注册的对象。是的,它将在以后的一段时间内保持这些对象的注册。除非您有特定的理由访问registeredObjects,否则它在日常操作中并没有多大价值。这有点像当年的-retainCount,听起来很有用,但最终对“我们”(非苹果开发者)没有价值。看,我不确定这是否是预期的行为。让人觉得有问题的是,即使在对相关对象执行了“删除”操作之后,临时上下文仍在声明它在内存中有这些已注册的对象。是的,它将在以后的一段时间内保持这些对象的注册。除非您有特定的理由访问registeredObjects,否则它在日常操作中并没有多大价值。这有点像当年的-retainCount,听起来很有用,但最终对“我们”(非苹果开发者)没有价值。似乎执行“refreshObject”或“refreshAllObjects”不会对我的应用程序造成任何负面影响。一次