2010-06-26 114 views
0

我想我有一個問題,也許鏈接到核心數據中的保留週期。 的代碼是一個後續,其中self.image也是NSManagedObject:保留週期與核心數據

- (void)setImage:(UIImage*)image1 andThumbnail:(UIImage*)image2 
{ 
    self.image.data = UIImageJPEGRepresentation(image1, 0.85); // This is autoreleased 
    self.thumbnail = UIImageJPEGRepresentation(image2, 0.85); // This is autoreleased 
} 

顯然,「self.image.date =」已保留一個是從來沒有公佈過(我認爲這是自我之間.image和自我)。因爲這個自我物體永遠不會被釋放,因此泄漏。

編輯:基本上我有和這裏一樣的問題:https://devforums.apple.com/message/246219#246219 我使用完全相同的結構,其中前面代碼中的self與給定鏈接中的Bar相對應。我也有相同的視圖控制器結構。但是,refreshObject不起作用。

我試圖使用NSManagedObjectContext refreshObject方法來打破保留週期(如Apple文檔中所建議的)。它對retainCount沒有影響。我可能沒有正確使用它,但我無法找到關於它的很多信息。如果我使用NSManagedObjectContext:reset:當我回到它時,我在根視圖控制器中發生崩潰。

謝謝!

回答

2

您不應該干涉託管對象上下文對託管對象內存的管理。

如果上面的self.image是一個託管對象,並且您還沒有編寫自定義訪問器,那麼您對它沒有內存管理問題。任何手動管理上下文內存的嘗試都會導致比解決問題更多的問題。

保留計數告訴你什麼都沒有,除了最簡單最小的命令行應用程序。一旦使用了像Core Data這樣的框架,幕後保留非常複雜,保留計數通常與您自己的代碼中發生的事情沒有任何關係。

顯然,「self.image.date =」 有一個保留一個從未發佈 (我認爲這是 self.image和自我之間)。由於那個 自我對象將永遠不會被釋放 因此泄漏。

這不會發生。在殺死實例本身之前,您不必殺死實例保留屬性中的所有對象。如果這是真的,你不能殺死一個與第三個對象共享一個屬性對象的實例。如果它們是非managedObject實例,則在self對象死亡後,對象可能會存在很長時間。只有通過上下文來強化實體圖才能使它們表現出不同的性質,並且與內存管理無關。

如果您在託管對象上看到神祕的保留計數1,那就是託管對象上下文對對象的保留。只要上下文相信託管對象必須存在於實體圖中,它永遠不會釋放該對象。

如果泄漏完全存在於核心數據堆棧中,那麼您的問題很可能在實體圖中self實體和self.image實體之間。實體圖阻止一個或另一個被拒絕或所需的關係最可能被刪除。

+0

我不會刪除實體。 其實我通過使用refreshObject:self.image解決了這個問題。沒有這一點,我認爲我只是因爲相互的關係而保持着自我和自我之間的保留循環。 – Kamchatka 2010-06-26 21:01:40

+0

我不確定你的問題是什麼,但只是將NSData實例保存到管理對象中不應導致泄漏。這是一個非常常見的操作。 – TechZen 2010-06-27 14:26:23