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

时间:2012-09-05 22:35:11

标签: objective-c ios xcode core-data

我遇到Core Data和NSMutableArray的问题。 阅读本文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/TP40003468-SW2 在“故障行为”一章中,我读到:由于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 :(得分: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 :-) (虽然我仍然很想知道它在真实的低内存情况下的行为。我希望这个缓存能够刷新...尝试发送内存警告对内存大小没有影响) 感谢