2012-09-16 17 views
-1

可能重複:
How do i avoid running out of memory when performing a task on every item of core data?如何避免在創建/刪除大量新的核心數據項時耗盡內存?

我貼this,其中有一個類似的標題,但它是一個不同的問題。爲了避免在同一問題中提出兩個問題時出現混淆,我單獨發佈了這些信息。

我想要做的是將大量數據添加到核心數據存儲,而不會耗盡內存。這裏是我目前的代碼:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entry"]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(version == %@)", @"1.0"]; 

[request setPredicate:predicate]; 

NSArray *results = [[AppDelegate applicationDelegate].managedObjectContext executeFetchRequest:request error:nil]; 

int i = 0; 

while (i < results.count) { 

    Entry *entry = [results objectAtIndex:i]; 

    entry.version = @"1.1"; 

    Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry" 
              inManagedObjectContext:[AppDelegate applicationDelegate].managedObjectContext]; 

    entry.version = existingEntry.version; 

    [[AppDelegate applicationDelegate].managedObjectContext deleteObject:entry]; 

    i++; 
} 

但是,這經歷了一定量的數據後,內存不足。這也會發生,如果我只是採取第一個'結果',並沒有通過整個數組,所以內存不足似乎不是通過結果的結果。

如何在不耗盡內存的情況下做到這一點?

+1

注意的是,上述代碼不能編譯,因爲你在同一個塊聲明'entry'兩次。 –

回答

2

假設您的計數是1000 - 一些大數字。把它分成一個較小的一個 - 比如100.然後在大循環中,設置另一個計數器,並在較小的循環周圍使用一個自動釋放池,所以當你離開內部循環時會耗盡池。假設你沒有強烈的內部循環中對象的引用(但即使在這種情況下也可能有幫助),這可以工作。

編輯:代碼(未測試或編譯)

int total = results.count; 
while (total) { 
    int count = total < 100 ? total : 100; 
    total -= count; 

    @autoreleasepool { 
     while(count--) { 
       Entry *entry = [results objectAtIndex:i]; 

       entry.version = @"1.1"; 

       Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry" 
                 inManagedObjectContext:[AppDelegate applicationDelegate].managedObjectContext]; 

       entry.version = existingEntry.version; 

       [[AppDelegate applicationDelegate].managedObjectContext deleteObject:entry]; 

      } 
     } 
} 
+0

我不確定你的意思,你可以發表一些代碼作爲例子嗎? – Andrew

+1

您必須小心,在@autorelease範圍內創建的任何內容預計不會在該範圍之外有效(除非保留或置於另一個將「擁有」它的對象中)。但基本的方法是需要做的。 –

相關問題