【问题标题】:retain cycle with core-data保留核心数据的周期
【发布时间】:2011-03-08 13:30:30
【问题描述】:

我认为我有一个问题,可能与 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 之间)。因此,self 对象将永远不会被释放,因此会泄漏。

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

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

谢谢!

【问题讨论】:

    标签: ios core-data memory-management retain


    【解决方案1】:

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

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

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

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

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

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

    如果泄漏完全在核心数据堆栈中,那么您的问题很可能出在self 实体和self.image 实体之间的实体图中。实体图正在阻止其中一个或另一个被拒绝或必需的关系最有可能被删除。

    【讨论】:

    • 我不删除实体。实际上,我通过在 self.image 上使用 refreshObject: 解决了这个问题。没有它,我认为我在 self 和 self.image 之间一直存在一个保留循环,只是由于相互关系。
    • 我不确定您的问题是什么,但仅将 NSData 实例保存到托管对象中不会导致泄漏。这是很常见的操作。
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2011-04-28
    • 2019-06-22
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2023-03-29
    相关资源
    最近更新 更多