0

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

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 属性,其中包括一个大属性。Instruments 显示每次运行代码时内存都会增加。

@autoreleasepool我添加了尝试解决这个问题,refreshObject:mergeChanges:但他们没有奏效。

我想要做的是将所有项目从这个商店手动移动到一个新的,因为标准迁移不适用于大数据。这是起点。

4

1 回答 1

1

为每个media你分配一个新的NSManagedObject. 相反,您可以定义一个实例media并重用它。

另外,我相信您实际上可以使用NSFetchedResultsController为迭代一组获取结果而优化的 a,并具有各种幕后内存优化。

然后,您可以像这样简单地迭代:

for (id object in _fetchedResultsController.fetchedObjects)

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

于 2012-09-25T16:09:17.703 回答