CoreData - 刷新对象不会更改registeredObjects计数

时间:2014-04-24 09:57:37

标签: objective-c core-data

我想释放一些内存,从上下文中释放未使用的ManagedObjects。

我不想使用reset,我想使用此功能释放单个对象:

[self.managedObjectContext refreshObject:alarm mergeChanges:NO];

现在,如果我在此次通话后记录registeredObjects count,似乎没有任何改变。在调用之前,我仍然获得了相同数量的对象。

为了帮助您理解这里的示例,它是对模型的简单描述: 这是一个包含提醒的典型任务列表。因此,有与这些任务相关的Task对象和Alarm对象。任何任务都可以有多个警报。

以下是产生此问题的代码:

 Alarm *alarm = [NSEntityDescription insertNewObjectForEntityForName:ENTITY_ALARM inManagedObjectContext:self.managedObjectContext];
    self.task.alarm = [NSSet setWithObject:alarm];

    [self saveContext];

    [self.managedObjectContext refreshObject:alarm mergeChanges:NO];

由于我在Task的详情视图中,我对内存中Alarm对象不感兴趣。


我的问题是:

1)调用refreshObject后,为什么注册对象的数量不会改变

2)这是一个好习惯吗?或者我应该重置,避免释放单个对象?

1 个答案:

答案 0 :(得分:2)

  

调用refreshObject

后,为什么注册对象的数量不会改变

因为你没有删除它,所以你只是将对象变成了一个错误(所以它的细节会从内存中移除而不是磁盘)。

  

这是一个好习惯吗?或者我应该使用重置,避免释放单个对象?

重置会破坏上下文中所有对象的内存中表示 - 您通常不希望这样做。刷新使对象有效,只是一个错误。刷新意味着您需要删除对该上下文中任何对象的所有引用,因为它们无效且无法再次使用(您需要重新获取)。

通常,刷新是一种很好的方法,但前提是您需要保留对对象的引用,并且不太可能经常需要对象详细信息。如果您不需要该对象,则应该将其释放。