2014-04-24 21 views
1

我想釋放一些內存釋放上下文中未使用的ManagedObjects。CoreData - 刷新一個對象不會改變registeredObjects計數

我不喜歡使用reset,我想用這個函數來釋放單個對象:

[self.managedObjectContext refreshObject:alarm mergeChanges:NO]; 

現在,如果我日誌registeredObjects count此調用之後,似乎一切都沒有改變。我仍然可以獲得與通話前相同數量的對象。

只是爲了幫助您理解這裏的示例,它是對模型的簡單描述: 這是一個典型的帶有提醒的任務列表。所以有與這些任務相關的Task對象和Alarm對象。任何任務都可以有多個警報。

這裏是產生這一問題的代碼:

Alarm *alarm = [NSEntityDescription insertNewObjectForEntityForName:ENTITY_ALARM inManagedObjectContext:self.managedObjectContext]; 
    self.task.alarm = [NSSet setWithObject:alarm]; 

    [self saveContext]; 

    [self.managedObjectContext refreshObject:alarm mergeChanges:NO]; 

因爲我在爲Task詳圖我不感興趣,在內存維護Alarm對象。


我的問題是:

1)爲什麼要註冊的對象的計數調用refreshObject

2)這是一個很好的做法後,不會改變?或者我應該重置,避免釋放單個對象?

+1

您只能對對象發生故障,所以應該保持註冊狀態,但其數據有故障。 – Volker

回答

2

爲什麼註冊對象的個數不叫refreshObject

因爲你不刪除它後更改,你只是把對象變成一個錯誤(所以它的細節被刪除內存但不是磁盤)。

這是一個很好的做法嗎?或者我應該重置,避免釋放單個對象?

復位銷燬所有在上下文中的對象的內存中表示 - 你通常並不想這樣做。刷新使對象保持有效,只是一個錯誤。刷新意味着您需要放棄對該上下文中的任何對象的所有引用,因爲它們無效並且不能再次使用(您需要重新獲取)。

一般來說,耳目一新的是一個好辦法,但前提是你需要保持對對象的引用,並不可能需要的對象的詳細信息非常頻繁。如果你不需要該對象,那麼你應該釋放它。

+0

我可以從MOC中只刪除一個對象而不是刷新嗎? – MatterGoal

+0

從商務部刪除的刪除,錯誤的內存刷新 - 你必須清楚你想要做的,從磁盤(刪除)或剛從RAM(刷新)刪除哪些。 – Wain

+0

我的意思是刷新內存。我以前的評論是指你的最後一句話:「如果你不需要的對象,那麼你應該釋放它來代替。「 – MatterGoal