访问NSManagedObject的数据属性给我的内存问题

我想我可能会遇到这个错误,也许有人可以指引我正确的方向。

我有一个Entry实体,它与Media实体有一对多的关系。 Media实体包含一个名为originalImage的数据属性。

迭代的前50个Entry实体在该集合中没有任何media项目。 之后,由于它访问originalImage属性并最终耗尽内存并退出到主屏幕,而没有任何其他消息,而不是NSLog中之前的内存警告。 通过仪器运行这个也表明它在这个时候内存不足。 这是我的代码:

 NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:oldMOC]; [oldFetchRequest setEntity:oldEntryEntity]; [oldFetchRequest setFetchBatchSize:10]; NSArray *entrys = [oldMOC executeFetchRequest:oldFetchRequest error:nil]; for (NSInteger index = 0; index < entrys.count; ++index) { Entry *entry = [entrys objectAtIndex:index]; NSOrderedSet *oldMediaSet = [entry valueForKey:@"media"]; for (Media *media in oldMediaSet) { @autorelease { [media valueForKey:@"originalImage"]; } } } 

删除originalImage行意味着它不会崩溃,这是什么让我相信它是与被访问相关。 也许我得到orderedSet的方式意味着这些项目留在内存中?

核心数据正在实现您正在访问的属性的错误,直到它填满了可用内存。 你试图用@autorelease来防止这种情况,但这还不够,因为你没有得到一个自动释放的实例,而是在对象图中的另一个对象。 不知道你想做什么,很难说如何解决这个问题。 你同时迭代循环,直到内存不足,所以没有内存警告会中断这个过程。

因此,如果你有一个循环试图将数据从一个实体移动到另一个MOC中的新实体,那么你应该做的是获得旧的实体,将数据分配给新的实体(不要复制它,将使你的问题更糟糕),然后使用'refreshObject:mergeChanges:'错误旧对象和新对象。 我相信这将工作,但没有自己试过(假设SQLite商店)。

核心数据编程指南“减less内存开销”还有其他的build议(pdf第148页)。