在创建/删除大量新核心数据项时,如何避免内存不足?

时间:2012-09-16 17:10:40

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

  

可能重复:
  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++;
}

但是在经过一定数量的数据后,这会耗尽内存。如果我只采用第一个'结果'并且不通过整个数组,也会发生这种情况,因此内存的耗尽似乎不是通过结果的结果。

如何在不耗尽内存的情况下执行此操作?

1 个答案:

答案 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];

            }
        }
}