-1

可能重复:
在对每个核心数据项执行任务时,如何避免内存不足?

我发布了这个,它有一个类似的标题,但是是另一回事。我单独发布了这个,以避免在同一个问题中提出 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++;
}

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

我怎样才能做到这一点而不会耗尽内存?

4

1 回答 1

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

            }
        }
}
于 2012-09-16T17:26:58.367 回答