2012-09-22 90 views
0

我想我可能要訪問這個錯誤,也許有人可以點我在正確的方向。訪問數據屬性給我的內存問題

我有一個Entry實體,它與Media實體有一對多的關係。媒體實體包含一個名爲originalImage的數據屬性。

迭代的前50個實體在集合中沒有任何media項目。在此之後,它會減慢,因爲它訪問originalImage屬性,並最終耗盡內存並退出到主屏幕,沒有比以前的記憶中的NSLog警告之外的任何消息。在儀器上運行此功能也會顯示此時已耗盡內存。這裏是我的代碼:

NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry" 
                  inManagedObjectContext:oldMOC]; 
[oldFetchRequest setEntity:oldEntryEntity]; 
[oldFetchRequest setFetchBatchSize:10]; 
NSArray *entrys = [oldMOC executeFetchRequest:oldFetchRequest error:nil]; 

for (NSInteger index = 0; index < entrys.count; ++index) { 

    Entry *entry = [entrys objectAtIndex:index]; 

    NSOrderedSet *oldMediaSet = [entry valueForKey:@"media"]; 

    for (Media *media in oldMediaSet) { 

     @autorelease { 

      [media valueForKey:@"originalImage"];  

     } 

    } 

} 

去除originalImage線意味着它不會崩潰,這是什麼使我相信這是關係到所訪問。也許我得到orderedSet的方式意味着這些項目留在內存中?

+0

安德魯,你有什麼想在這裏完成?你爲什麼要加載每張圖片 - 你是否想要找到一張圖片,如果是,那麼爲什麼不給媒體添加一些標籤,以便知道你想要的圖片。如果你真的只想看到每張圖片的大小,那也沒問題,我可以給你一些建議,但首先讓我知道你想要完成什麼。 –

+0

@DavidH我想將舊數據庫中的所有條目遷移到新數據庫。我有比上面更多的代碼,但將它評論爲找到只留下上面代碼的問題。爲什麼我不使用標準遷移?因爲蘋果承認,這不適用於大數據集,所以我必須手動完成。 – Andrew

回答

1

核心數據正在履行您正在訪問的性能故障,直到它填補了它的可用內存。你試圖用@autorelease來抵禦這種情況,但這還不夠,因爲你沒有獲得自動發佈的實例,而是獲得了對象圖中的另一個對象。不知道你想要做什麼,很難說如何解決這個問題。你同時迭代循環,直到內存不足,所以沒有內存警告會中斷這個過程。

+0

我正嘗試從舊數據庫遷移到新數據庫。隨着更多的代碼,如在新的數據庫中創建實體,它仍然崩潰,但是評論表明它是上面的代碼崩潰。 – Andrew

0

所以,如果你有一個循環試圖將數據從一個實體在不同的MOC移動到一個新的,那麼你應該做的是越來越老的實體,分配數據到新的實體(不要複製它會使你的問題變得更糟),然後使用'refreshObject:mergeChanges:'錯誤地檢查舊對象和新對象。我相信這會起作用,但是我沒有試過它(假設SQLite商店)。

有核心數據編程指南中的其他建議「減少內存開銷」(PG的PDF 148)。