NSFetchRequest内存问题

时间:2012-09-24 22:00:31

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

我已经发布了与此相关的不同事情的类似问题,但是现在已经挣扎了大约一个星期,但无济于事。这一切都归结为这段代码:

NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Media"
                                                          inManagedObjectContext:oldContext];
        [oldFetchRequest setEntity:oldEntryEntity];
        [oldFetchRequest setFetchBatchSize:10];
        NSArray *medias = [oldContext executeFetchRequest:oldFetchRequest error:&error];

    int i = 0;

    int count = [oldContext countForFetchRequest:oldFetchRequest error:nil];

    NSLog(@"count: %i", count);

    while (i < count) {
        @autoreleasepool {
        NSManagedObject *media = [medias objectAtIndex:i];

            [oldContext refreshObject:media mergeChanges:NO];

        NSLog(@"i: %i", i);
        i++;
        }
    }

计数应达到约250,media项的数量。在应用耗尽内存并崩溃之前,它实际上达到了大约100。每次运行此代码时,它会构建越来越多的内存,可能是因为每个media包含许多NSData属性,包括一个大的属性。仪器显示每次运行代码时内存都会增加。

@autoreleasepoolrefreshObject:mergeChanges:我添加了尝试修复此问题,但它们没有用。

我要做的是手动将此商店中的所有商品移动到新商店,因为标准迁移不适用于大数据。这是起点。

1 个答案:

答案 0 :(得分:1)

对于每个media,您正在分配NSManagedObject的新实例。相反,您可以定义media的一个实例并重用它。

另外,我相信你实际上可以使用NSFetchedResultsController,它被优化用于迭代一组获取结果,并具有各种幕后内存优化。

然后你可以像这样迭代:

for (id object in _fetchedResultsController.fetchedObjects)

我认为这两个建议都应该显着减少内存占用。