2010-06-26 67 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