我想释放一些内存,从上下文中释放未使用的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)这是一个好习惯吗?或者我应该重置,避免释放单个对象?
答案 0 :(得分:2)
调用refreshObject
后,为什么注册对象的数量不会改变
因为你没有删除它,所以你只是将对象变成了一个错误(所以它的细节会从内存中移除而不是磁盘)。
这是一个好习惯吗?或者我应该使用重置,避免释放单个对象?
重置会破坏上下文中所有对象的内存中表示 - 您通常不希望这样做。刷新使对象有效,只是一个错误。刷新意味着您需要删除对该上下文中任何对象的所有引用,因为它们无效且无法再次使用(您需要重新获取)。
通常,刷新是一种很好的方法,但前提是您需要保留对对象的引用,并且不太可能经常需要对象详细信息。如果您不需要该对象,则应该将其释放。