Ios 核心数据:何时使用[refreshObject:obj mergeChanges:NO]“释放”未使用的NSManagedObject?

Ios 核心数据:何时使用[refreshObject:obj mergeChanges:NO]“释放”未使用的NSManagedObject?,ios,objective-c,core-data,Ios,Objective C,Core Data,我正在进行我的第一个核心数据项目,基于Xcode的通用主细节模板的NSManagedObjectModel开发阶段。基于ObjectModel的存储区已经填充了各种对象的实例 导航控制器表视图由12个顶层结构填充,每个顶层结构都有一个与其关联的DefaultSpace。选择表行后,将根据DefaultSpace的属性使用各种UIView子类填充详图视图。 从现在开始,我使用了一系列临时NSObject子类来响应用户交互,当我开发了这个阶段,能够更全面地理解持久性需求时,其中一些将被NSManag

我正在进行我的第一个核心数据项目,基于Xcode的通用主细节模板的NSManagedObjectModel开发阶段。基于ObjectModel的存储区已经填充了各种对象的实例

导航控制器表视图由12个顶层结构填充,每个顶层结构都有一个与其关联的DefaultSpace。选择表行后,将根据DefaultSpace的属性使用各种UIView子类填充详图视图。 从现在开始,我使用了一系列临时NSObject子类来响应用户交互,当我开发了这个阶段,能够更全面地理解持久性需求时,其中一些将被NSManagedObjects所取代

因此,当我对给定的DefaultSpace在细节视图中进行了一些测试并返回到主表以选择另一个结构的DefaultSpace时,我希望ARC释放不再需要的NSObjects。在我的天真中,我也希望核心数据对NSManagedObjects也能起到同样的作用,但仪器告诉我情况并非如此

据我所知 [managedObjectContext刷新对象:对象合并更改:否];是用于将现在冗余的子对象转化为故障的方法。然而,这似乎意味着遍历关系链并调用[managedObjectContext refreshObject:obj mergeChanges:NO];在每个下属NSManagedObject上。
我的问题是,在什么情况下我应该这样做,还是应该让核心数据决定何时“清理”未使用的对象?

大多数情况下,您可以让核心数据在这里完成它的工作。在加载大量对象时,重新设置对象错误是一件很有用的事情,特别是当单个实例有大量数据时。在这种情况下,一旦你处理完它们,就把它们处理掉。然而,在大多数情况下,这是完全没有必要的。只要像对待其他物体一样对待它们,除非你有理由期待内存压力。在大多数情况下,我只会在对潜在的大型数据存储进行自定义迁移时对对象进行故障处理,因为我知道我将要加载大量数据,因此需要更加小心地对其进行管理。

大多数情况下,您可以让核心数据在这里完成它的工作。在加载大量对象时,重新设置对象错误是一件很有用的事情,特别是当单个实例有大量数据时。在这种情况下,一旦你处理完它们,就把它们处理掉。然而,在大多数情况下,这是完全没有必要的。只要像对待其他物体一样对待它们,除非你有理由期待内存压力。在大多数情况下,我只会在对潜在的大型数据存储进行自定义迁移时对对象重新设置故障—我知道我将加载大量数据,因此需要更加小心地管理这些数据。

据我所知,请随时更正任何错误:

CoreData在上下文和协调器级别管理内存协调器可以被视为主缓存

在协调员级别,您所能做的很少。CoreData正在为正在使用的对象记账,如果您通过该协调器获取对象,则其快照将保存在该协调器中,该对象的后续获取将更快。 尝试处理不再使用的上下文或重置它们

在上下文级别,CoreData仅在必须处理内存警告、处理挂起的更改等事件时才回收内存。 例如,保存上下文时,上下文将释放所有未保留强引用的对象。 获取的对象被与它们有关系的其他对象牢牢地控制着,必须手动断开这些联系,这足以让您保留一个对象,以便将对象图的一大块保留在内存中


一些可能有用的东西:

据我所知,请随意更正任何错误:

CoreData在上下文和协调器级别管理内存协调器可以被视为主缓存

在协调员级别,您所能做的很少。CoreData正在为正在使用的对象记账,如果您通过该协调器获取对象,则其快照将保存在该协调器中,该对象的后续获取将更快。 尝试处理不再使用的上下文或重置它们

在上下文级别,CoreData仅在必须处理内存警告、处理挂起的更改等事件时才回收内存。 例如,保存上下文时,上下文将释放所有未保留强引用的对象。 获取的对象被与它们有关系的其他对象牢牢地控制着,必须手动断开这些联系,这足以让您保留一个对象,以便将对象图的一大块保留在内存中


一些可能有帮助的东西:

我在运行I时创建了自己的CD垃圾收集器
同样的问题。垃圾=在UI中任何地方都看不到的对象。@nielsbot听起来像是在与框架作斗争。核心数据可以很好地自我清理,而不需要任何形式的垃圾收集器。我说的是保持本地对象图与服务器上的对象图同步。当从服务器中删除对象时,我需要在同步后将其从设备中删除。但看起来我的评论不适用于这种情况,我应该仔细阅读。我将展示我自己。当我遇到同样的问题时,我创建了自己的CD垃圾收集器。垃圾=在UI中任何地方都看不到的对象。@nielsbot听起来像是在与框架作斗争。核心数据可以很好地自我清理,而不需要任何形式的垃圾收集器。我说的是保持本地对象图与服务器上的对象图同步。当从服务器中删除对象时,我需要在同步后将其从设备中删除。但看起来我的评论不适用于这种情况,我应该仔细阅读。我将展示自己。我还想补充一点,在应用程序完成之前考虑这一点是一种预先优化的形式。不要假设核心数据是内存问题,等到你能通过仪器证明它。在我的情况下,DefaultSpace可能会获取100个100字节大小的对象;我想你说的是100个kB大小的物体的顺序?还感谢Marcus对优化前的评论。@cate,对,至少有那么大。对于你所描述的用途,我不需要再挑剔了。我还想补充一点,在应用程序完成之前考虑这一点是一种预先优化的形式。不要假设核心数据是内存问题,等到你能通过仪器证明它。在我的情况下,DefaultSpace可能会获取100个100字节大小的对象;我想你说的是100个kB大小的物体的顺序?还感谢Marcus对优化前的评论。@cate,对,至少有那么大。对于您所描述的用途,我不想麻烦重新设置错误。有用的链接讨论警告不要对NSFetchedResultsController获取的对象“强制设置错误”;在我的例子中,只提取结构来填充表,但我可以想象这样的场景:DefaultSpace也可能存在,因此过度焦虑地使用[managedObjectContext refreshObject:obj mergeChanges:NO]会导致问题,因为链接讨论警告不要对NSFetchedResultsController提取的对象“强制出错”;在我的例子中,只提取结构来填充表,但我可以想象DefaultSpace也可能是这样的场景,因此过度焦虑地使用[managedObjectContext refreshObject:obj mergeChanges:NO]会导致问题