簡體   English   中英

核心數據觸發錯誤將對象添加到NSMutableArray?

[英]Core Data Firing fault adding objects to NSMutableArray?

我對核心數據和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。

有什么建議嗎? 謝謝

好的,這是我的錯誤,僅查看Instruments的內存占用來確定故障是否正在觸發。

Core Data文檔說:如果需要確定對象是否為故障,則可以發送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 :-)(盡管我仍然很想知道它在真正的內存不足情況下的行為。我希望此緩存能夠刷新...嘗試發送內存警告對內存大小沒有影響)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM