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

我正在尝试执行类似下面的任务:

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个结果继续?

我所要求的基本上是我如何只抓取一定数量的数据,停止内存耗尽,然后抓另一批?

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

这是使用@autoreleasepool的最佳例子

在循环中执行的所有代码周围放置一个@autoreleasepool。 这会在处理完成后自动释放这些对象,所以你的内存占用很less。 如果使用这种技术,你不应该指定一个批量大小。

有关更多信息,请参阅Apple文档。

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