2012-02-05 103 views
2

我爭奪明白我與核心數據和簡單讀取請求時所遇到的問題:核心數據讀取請求使用了大量的內存

我需要顯示一些記錄,我執行這些代碼

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Venue"          
inManagedObjectContext:self.managedObjectContext]]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id_" ascending:YES]; 

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[sortDescriptor release]; 
sortDescriptor = nil; 

[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
sortDescriptors = nil; 

[self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 

到目前爲止好,但在儀器我可以看到,裝載記錄之前,我的記憶爲9MB,事後跳轉到內存44MB(!),並仍然存在。但我想從內存中釋放所有記錄,因爲我不再需要它們了。我錯過了什麼?我認爲Core Data在他們不再需要的時候發佈了這些記錄。我試圖做一個for-cycle來發布每個ManagedObject,但它們已經是+1計數,這意味着它們即將發佈。

+0

這是iOS和OSX? – Damien 2012-02-05 12:05:41

+0

對不起,忘了提及iOS – DigitalVanilla 2012-02-05 12:50:12

+0

我將iOS添加到標籤。 – 2012-02-05 13:25:36

回答

1

如果你不再需要你的NSManagedObjects,你可以手動將它們變回fault。即從NSManagedObjectContext中移除它們。下一次您需要它們時,它們將再次從持久性存儲中加載。

我這樣做是爲了節省內存,當我與服務器同步並更新對象時,但我不需要立即使用它們。

要重新故障,使用(並閱讀API文檔關於它的用法)

- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag 
+0

好,我什麼都試過,但沒有任何工程:NSZombie被禁用(如在這個崗位https://discussions.apple.com/thread/3103423?start = 0&tstart = 0),我還添加了一塊Autorelease池對象,並在獲取線後很快耗盡,我從實體創建了一個類對象,並在dealloc方法中放置了一個簡單的NSLog。我可以看到每個記錄都按預期發佈,持有核心數據對象(上下文...)的主對象被釋放並且上下文也被重置,並且一切都消失了,我仍然擁有我的內存fileld,其數據爲I由於某種原因無法釋放它。 – DigitalVanilla 2012-02-08 17:07:39

+1

因此,在儀器分配中,您可以看到跟蹤使用該內存的內容?嘗試更改爲調用堆棧,並將調用樹,隱藏系統庫...並查看代碼中是否有任何內存正在使用。 – bandejapaisa 2012-02-08 19:19:26

+0

我上傳的測試項目www.digitalvanilla.com/test.zip – DigitalVanilla 2012-02-09 09:13:00

2

你應該發佈請求 [fetchRequest release];

+0

我正在發佈它,但沒有任何記憶。 – DigitalVanilla 2012-02-08 16:58:40

+0

一些問題: 1. iOS設備或模擬器? 2.你以後拿什麼數據? 3.取多少行? – NeverBe 2012-02-08 21:16:45

+0

。 iOS 。現在我沒有對提取的數據做任何事情,只是垃圾一切 。大約1500行獲取 – DigitalVanilla 2012-02-09 09:03:07