我已经发布了与此相关的不同问题的类似问题,但到目前为止已经挣扎了大约一周,但都无济于事。这一切都归结于下面的代码:
NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Media"
inManagedObjectContext:oldContext];
[oldFetchRequest setEntity:oldEntryEntity];
[oldFetchRequest setFetchBatchSize:10];
NSArray *medias = [oldContext executeFetchRequest:oldFetchRequest error:&error];
int i = 0;
int count = [oldContext countForFetchRequest:oldFetchRequest error:nil];
NSLog(@"count: %i", count);
while (i < count) {
@autoreleasepool {
NSManagedObject *media = [medias objectAtIndex:i];
[oldContext refreshObject:media mergeChanges:NO];
NSLog(@"i: %i", i);
i++;
}
}计数应该达到250左右,即media项目的数量。在应用程序耗尽内存并崩溃之前,它实际上达到了大约100。每次运行这段代码时,它都会构建越来越多的内存,大概是因为每个media都包含许多NSData属性,包括一个很大的属性。每次运行代码时,仪器都会显示内存增加。
我添加了@autoreleasepool和refreshObject:mergeChanges:来尝试解决这个问题,但它们并没有起作用。
我想要做的是手动将所有项目从这个存储移到一个新的存储中,因为标准迁移不适用于大数据。这是起点。
发布于 2012-09-26 00:09:18
为每个media分配一个新的NSManagedObject实例。相反,您可以定义一个media实例并重用该实例。
此外,我相信您实际上可以使用NSFetchedResultsController,它针对迭代一组fetch结果进行了优化,并具有各种幕后内存优化。
然后,您可以像这样简单地迭代:
for (id object in _fetchedResultsController.fetchedObjects)我认为这两个建议都应该大大减少内存占用。
https://stackoverflow.com/questions/12573529
复制相似问题