首页 文章

使用核心数据保留周期

提问于
浏览
0

我想我有一个问题,可能与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 回答

  • 2

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

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

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

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

    这不会发生 . 您不必杀死实例中的所有对象's retained attributes before killing the instance itself. If that was true, you couldn' t杀死与第3个对象共享属性对象的实例 . 如果它们是非托管对象实例, self.image 对象可能在 self 对象死亡后很久就存在 . 只有上下文强制实体图使它们的行为不同,而且与内存管理无关 .

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

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

相关问题