【问题标题】:Accessing data attribute of NSManagedObject gives me memory issues访问 NSManagedObject 的数据属性会给我带来内存问题
【发布时间】:2012-09-14 18:01:12
【问题描述】:

我想我可能访问错了,也许有人可以指出我正确的方向。

我有一个Entry 实体,它与Media 实体具有一对多的关系。 Media 实体包含一个名为 originalImage 的数据属性。

此迭代的前 50 个 Entry 实体在集合中没有任何 media 项。之后,它在访问originalImage 属性时变慢,最终内存不足并退出到主屏幕,除了之前在 NSLog 中的内存警告之外没有任何消息。通过 Instruments 运行它也显示它此时内存不足。这是我的代码:

NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry"
                                                          inManagedObjectContext:oldMOC];
[oldFetchRequest setEntity:oldEntryEntity];
[oldFetchRequest setFetchBatchSize:10];
NSArray *entrys = [oldMOC executeFetchRequest:oldFetchRequest error:nil];

for (NSInteger index = 0; index < entrys.count; ++index) {

    Entry *entry = [entrys objectAtIndex:index];

    NSOrderedSet *oldMediaSet = [entry valueForKey:@"media"];

    for (Media *media in oldMediaSet) {

        @autorelease {

            [media valueForKey:@"originalImage"];    

        }

    }

}

删除 originalImage 行意味着它不会崩溃,这让我相信它与被访问的内容有关。也许我获得orderedSet的方式意味着这些项目留在内存中?

【问题讨论】:

  • 安德鲁,你想在这里完成什么?你为什么要加载每张图片 - 你是否试图找到一张图片,如果是这样,那么为什么不向媒体添加一些标签,这样你就知道你想要哪张图片。如果你真的只是想看看每张图片的大小,那也没关系,我可以给你一些建议,但首先让我知道你想要完成什么。
  • @DavidH 我想将所有条目从旧数据库迁移到新数据库。我有比上面更多的代码,但将其注释掉以找到仅留下上面代码的问题。为什么我不使用标准迁移?因为正如 Apple 承认的那样,这不适用于大型数据集,所以我必须手动完成。

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


【解决方案1】:

Core Data 正在满足您正在访问的属性的故障,直到它填满其可用内存。您正在尝试使用@autorelease 来防御这种情况,但这还不够,因为您没有获得自动释放的实例,而是对象图中的另一个对象。在不知道您要做什么的情况下,很难说出如何解决该问题。您在循环中同步迭代,直到内存不足,因此不会有内存警告中断此过程。

【讨论】:

  • 我正在尝试从旧数据库迁移到新数据库。使用更多代码,例如在新数据库中创建实体,它仍然会崩溃,但将其注释掉表明是上面的代码崩溃了。
【解决方案2】:

因此,如果您有一个循环试图将数据从一个实体移动到另一个 MOC 中的新实体,那么您应该做的是获取旧实体,将数据分配给新实体(不要复制它, 会让你的问题变得更糟),然后使用'refreshObject:mergeChanges:'对旧对象和新对象进行故障排除。我相信这会起作用,但我自己还没有尝试过(假设 SQLite 商店)。

Core Data Programming Guide 'Reducing Memory Overhead'(pdf 的第 148 页)中还有其他建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多