我已经发布了与此相关的不同事情的类似问题,但是现在已经挣扎了大约一个星期,但无济于事。这一切都归结为这段代码:
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:
我添加了尝试修复此问题,但它们没有用。
我要做的是手动将此商店中的所有商品移动到新商店,因为标准迁移不适用于大数据。这是起点。
答案 0 :(得分:1)
对于每个media
,您正在分配NSManagedObject
的新实例。相反,您可以定义media
的一个实例并重用它。
另外,我相信你实际上可以使用NSFetchedResultsController
,它被优化用于迭代一组获取结果,并具有各种幕后内存优化。
然后你可以像这样迭代:
for (id object in _fetchedResultsController.fetchedObjects)
我认为这两个建议都应该显着减少内存占用。