首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFetchRequest内存问题

NSFetchRequest内存问题
EN

Stack Overflow用户
提问于 2012-09-25 06:00:31
回答 1查看 196关注 0票数 0

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

代码语言:javascript
复制
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:来尝试解决这个问题,但它们并没有起作用。

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

EN

回答 1

Stack Overflow用户

发布于 2012-09-26 00:09:18

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

此外,我相信您实际上可以使用NSFetchedResultsController,它针对迭代一组fetch结果进行了优化,并具有各种幕后内存优化。

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

代码语言:javascript
复制
for (id object in _fetchedResultsController.fetchedObjects)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12573529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档