核心数据触发错误将对象添加到 NSMutableArray?
Posted
技术标签:
【中文标题】核心数据触发错误将对象添加到 NSMutableArray?【英文标题】:Core Data Firing fault adding objects to NSMutableArray? 【发布时间】:2012-09-05 22:35:11 【问题描述】:我对 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。
有什么建议吗? 谢谢
【问题讨论】:
只是检查一下,您还没有覆盖isEqual:
或hash
?
您如何知道故障是否/何时触发?您是否在记录 SQL 语句?使用仪器?猜猜?
@Carl:不,我没有覆盖那些方法。
@Jody,我正在使用仪器。我看到最后一条指令后内存占用增加了。我的托管对象只有 2 个变量:一个字符串和一个图像。数据库中的所有图像(到目前为止)大约为 50MB。我看到在最后一条指令之后内存占用增加到 50MB。我希望只有在访问图像(这会导致故障触发)之后才能看到这个增量......还是没有?
【参考方案1】:
好的,我的错误是只查看 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 缓存造成的。 过失:-) (虽然我仍然很想知道它在真正的低内存情况下的行为。我希望这个缓存能够刷新......尝试发送内存警告对内存大小没有影响) 谢谢
【讨论】:
以上是关于核心数据触发错误将对象添加到 NSMutableArray?的主要内容,如果未能解决你的问题,请参考以下文章
核心数据 - 在不触发错误的情况下获取对多关系的 objectID
核心数据异常:向实体添加新属性后出现 SQLite“没有这样的列”错误