0

我对 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。

有什么建议吗?谢谢

4

1 回答 1

0

好的,我的错误是只查看 Instruments 内存占用来确定故障是否触发。

Core Data 文档说:如果你需要确定一个对象是否是错误的,你可以在不触发错误的情况下向它发送 isFault 消息。如果 isFault 返回 NO,则数据必须在内存中。但是,如果 isFault 返回 YES,并不意味着数据不在内存中。数据可能在内存中,也可能不在内存中,这取决于影响缓存的许多因素。

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

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 :-) (尽管我仍然很想知道它在真正的低内存情况下的表现。我希望这个缓存能够刷新......尝试发送内存警告对内存大小没有影响)谢谢

于 2012-09-06T07:00:38.090 回答