使用核心数据保留周期

时间:2010-06-26 05:45:03

标签: ios core-data memory-management retain

我认为我遇到了问题,可能与Core-Data中的保留周期有关。 代码是一个跟随,其中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 =”有一个永不释放的保留(我认为它是在self.image和self之间)。因此,自我对象将永远不会被释放,从而泄漏。

编辑:基本上我遇到的问题与此处相同:https://devforums.apple.com/message/246219#246219 我使用完全相同的结构,其中前一代码中的self对应于给定链接中的Bar。我也有相同的视图控制器结构。但是,refreshObject没有帮助。

我尝试使用NSManagedObjectContext refreshObject方法来中断保留周期(如Apple文档中所示)。它对retainCount没有影响。我可能没有以正确的方式使用它,但我找不到有关它的更多信息。如果我使用NSManagedObjectContext:reset:当我回到它时,我在根视图控制器中崩溃了。

谢谢!

1 个答案:

答案 0 :(得分:2)

您不应该干扰托管对象上下文对托管对象内存的管理。

如果上面的self.image是托管对象而您还没有编写自定义访问者,那么您就没有内存管理问题。任何手动管理上下文内存的尝试几乎总会导致比它解决的问题更多的问题。

除最简单和最小的命令行应用程序外,保留计数不会告诉您任何内容。一旦你使用像Core Data这样的框架,幕后保留是如此复杂,以至于保留计数通常与你自己的代码中发生的事情没有任何关系。

  

显然,“self.image.date =”   有一个永不释放的保留   (我认为它介于两者之间   self.image和self)。因此   自我对象永远不会被释放   因此泄漏。

这不会发生。在杀死实例本身之前,您不必杀死实例的保留属性中的所有对象。如果这是真的,则无法终止与第3个对象共享属性对象的实例。如果它们是非托管对象实例,则self.image对象在self对象死亡后很久就可以存在。只有上下文强制实体图使它们的行为不同,而且与内存管理无关。

如果在托管对象上看到神秘的保留计数为1,那就是托管对象上下文对对象的保留。只要上下文认为托管对象必须存在于实体图中,它就永远不会释放该对象。

如果泄漏完全在Core Data堆栈中,那么您的问题很可能出现在self实体和self.image实体之间的实体图中。实体图表阻止最有可能通过拒绝或必需关系删除一个或另一个。