核心数据获取请求使用大量内存

时间:2012-02-05 09:39:35

标签: ios objective-c core-data memory-management

我正在努力了解我使用Core Data遇到的问题以及一个简单的提取请求:

我需要显示一些记录,然后执行这些代码行

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Venue"                                     
inManagedObjectContext:self.managedObjectContext]];

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id_" ascending:YES]; 

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];  
[sortDescriptor release];
sortDescriptor = nil;

[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release];
sortDescriptors = nil;

[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

到目前为止一切都那么好,但是在仪器中我可以看到,在加载记录之前,我的内存是9mb,之后内存跳到44mb(!!)并且仍在那里。但我想从内存中释放所有记录,因为我不再需要它们了。我错过了什么?我认为Core Data在不再需要它们之后发布了这些记录。我尝试使用for-cycle来释放每个ManagedObject,但它们已经+1了,这意味着它们很快就会被释放。

2 个答案:

答案 0 :(得分:2)

你应该发布请求  [fetchRequest release];

答案 1 :(得分:1)

如果您不再需要NSManagedObjects,可以手动将它们重新转换为fault。即从NSManagedObjectContext中删除它们。下次需要它们时,它们将再次从持久存储中加载。

当我与服务器同步并更新对象时,我这样做是为了节省内存,但我不需要立即使用它们。

要重新出错,请使用此功能(并阅读有关其用法的API文档)

- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag