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

时间:2012-09-16 16:19:04

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

我正在尝试执行与此类似的任务:

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

            i++;
        }

但是在它完成所有结果之前它会耗尽内存。

我知道这件事:

[request setFetchBatchSize:20];

但是我想知道这对我有什么用?是否会在20个结果后停止处理,或者只是抓住前20个结果然后以某种方式抓住接下来的20个并继续?

我要问的是,我如何才能获取一定数量的数据,以阻止内存耗尽,然后再获取另一批数据?

2 个答案:

答案 0 :(得分:0)

你猜对了。您必须使用setFetchBatchSize:。这只会返回前20个对象。如果要获取接下来的20个对象,则必须使用setFetchOffset:设置偏移量。

答案 1 :(得分:0)

这是使用@autoreleasepool

的完美案例

在循环中执行的所有代码周围放置一个@autoreleasepool。这将在处理后自动释放对象,从而使内存占用率保持在较低水平。如果使用此技术,则不必指定批量大小。

有关详细信息,请参阅此处的Apple文档;

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html