可能重复:
How do i avoid running out of memory when performing a task on every item of core data?
我发布了this,其标题相似,但却是另一回事。我单独发布这个,以避免在同一个问题中提出2个问题时出现混淆。
我希望做的是在核心数据存储中添加大量数据,而不会耗尽内存。这是我目前的代码:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entry"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(version == %@)", @"1.0"];
[request setPredicate:predicate];
NSArray *results = [[AppDelegate applicationDelegate].managedObjectContext executeFetchRequest:request error:nil];
int i = 0;
while (i < results.count) {
Entry *entry = [results objectAtIndex:i];
entry.version = @"1.1";
Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
inManagedObjectContext:[AppDelegate applicationDelegate].managedObjectContext];
entry.version = existingEntry.version;
[[AppDelegate applicationDelegate].managedObjectContext deleteObject:entry];
i++;
}
但是在经过一定数量的数据后,这会耗尽内存。如果我只采用第一个'结果'并且不通过整个数组,也会发生这种情况,因此内存的耗尽似乎不是通过结果的结果。
如何在不耗尽内存的情况下执行此操作?
答案 0 :(得分:2)
假设你的数量是1000 - 一些大数字。将其分解为较小的一个 - 如100.然后在大循环中,设置另一个计数器,并在较小的循环周围使用自动释放池,因此当您离开该内循环时将耗尽池。这可以假设您没有对内循环中的对象的强引用(但即使在这种情况下也可能有帮助)。
编辑:代码(未经测试或编译)
int total = results.count;
while (total) {
int count = total < 100 ? total : 100;
total -= count;
@autoreleasepool {
while(count--) {
Entry *entry = [results objectAtIndex:i];
entry.version = @"1.1";
Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
inManagedObjectContext:[AppDelegate applicationDelegate].managedObjectContext];
entry.version = existingEntry.version;
[[AppDelegate applicationDelegate].managedObjectContext deleteObject:entry];
}
}
}