2012-09-27 52 views
2

核心數據指導方針建議您使用逆模型建立關係。那裏沒有問題。如何處理核心數據保留週期

有趣的是,如果你加載了一個對象A,它與B具有多對多的關係,並且走過對象圖形,那麼最終會產生一個保留週期,並且內存永遠不會被釋放。

對於簡單的對象圖,您可以只調用refreshObject:mergeChanges:on來重新對對象進行故障,以便關係不再是強引用。

如果你有一個複雜的對象圖,雖然這是一種痛苦,因爲你需要在你觸及的每個對象上調用它。在使用核心數據時,這似乎是一個非常重要的考慮事項,但在Apples文檔中只有一個關於此主題的段落。

我只是想知道其他人如何處理這個?長時間運行的應用程序會慢慢消耗越來越多的內存,而無需進行某種手動過程來強制對象恢復到故障狀態。

是否有任何已知的模式來處理這個問題。我會想象如此,因爲很多人使用核心數據我只是找不到任何建議

+0

你怎麼知道你首先進入保留循環?是否使用ARC選項? – Eimantas

+0

ARC不會阻止保留週期,它不同於垃圾回收(我已經在使用ARC)。上面的例子說明了在正常使用情況下如何在覈心數據中發生保留週期。 – Imran

+2

很多人使用核心數據,你是對的。它已經存在多年了。你需要在第二段中檢查你的斷言。是這樣嗎?如果這是核心數據的缺陷,人們會談論它,你不覺得嗎? – Jessedc

回答

1

您在做斷言時忽略了核心數據的幾個方面。如果您獲取一個對象,讓我們說對象A,它與對象B具有一對多的關係,當您獲取A時,您將擁有B上與A相關的所有對象。一對多關係創建與A相關的對象列表,並將它們包含在NSManagedObject子類的NSSet屬性中。請注意,這些對象處於故障狀態,並且其內存佔用量不明顯。如果您操縱關係中的對象,核心數據將在必要時將這些對象置爲非故障狀態。你不必做任何事情來獲得這種行爲。如果您想自己觸發錯誤行爲以再次發送對象,您可以使用refreshObject:mergeChanges :.如果你不發回他們的錯誤,最終會再次觸發錯誤行爲。

+1

「如果您沒有將它們發回過錯,最終會再次觸發故障行爲。」那是在文檔中,因爲我沒有看到它?我有一個印象,你必須手動做,但如果是這樣的話,我沒有什麼可擔心的。 – Imran