首页 文章

核心数据触发故障将对象添加到NSMutableArray?

提问于
浏览
0

我有Core Data和NSMutableArray的问题 . 阅读本文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/TP40003468-SW2在"Faulting Behavior"章节中我读到:由于isEqual和hash不会导致错误触发,因此通常可以将托管对象放置在集合中而不会触发故障 .

好的,出于这个原因,我明白我可以: - 获取managedObjectContext - 将所有托管对象放入一个数组(对象包含图像数据)

没有触发故障和浪费内存(直到第一次访问对象),对吗?

但是,由于某种原因,当我尝试将结果放入NSMutableArray时,Core Data会触发错误

NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:request error:&error]; //this line does'n fire a fault
self.cache = [NSMutableArray arrayWithArray:fetchResults]; //this line fires a fault

self.cache只是一个NSMutableArray . 在最后一行代码之后,我看到通过仪器增加了内存使用量(我在数据库中有50MB的图像,内存从2-3Mb立即到52-53MB .

有什么建议吗?谢谢

1 回答

  • 0

    好吧,我错误地只关注仪器内存占用来确定故障是否正在发射 .

    核心数据文档说:如果您需要确定对象是否是故障,您可以向它发送isFault消息而不会触发故障 . 如果isFault返回NO,则数据必须在内存中 . 但是,如果isFault返回YES,则不表示数据不在内存中 . 数据可能在内存中,也可能不在内,这取决于影响缓存的许多因素 .

    我在“incriminate”行之后添加了这段代码:

    for (ImageCache *cache in self.cache) {
        NSLog(@"Is fault? %i", [cache isFault]);
    }
    

    所有对象的结果都是1 .

    然后我修改了for循环:

    for (ImageCache *cache in self.cache) {
        NSLog(@"Is fault? %i", [cache isFault]);
        UIImageView *imageView = [[UIImageView alloc]initWithImage:cache.image];
        NSLog(@"Is fault? %i", [cache isFault]);
    }
    

    结果是第一个NSLog为1,每个对象的第二个NSLog为0(访问图像后触发的故障)

    正如文档所说,似乎Core Data正确地对我的对象进行了错误处理,内存占用是由于Core Data缓存造成的 . Mea culpa :-)(虽然我仍然很想知道它在真实的低内存情况下的行为 . 我希望这个缓存能够刷新...试图发送内存警告对内存大小没有影响)谢谢

相关问题