繁体   English   中英

与核心数据保持周期

[英]retain cycle with core-data

我认为我有问题,可能与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文档中所建议)。 它对keepCount没有影响。 我可能没有正确使用它,但找不到太多信息。 如果使用NSManagedObjectContext:reset:回到根视图控制器时会崩溃。

谢谢!

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

如果上面的self.image是一个托管对象,并且您没有编写自定义访问器,那么您就不必担心内存管理问题。 手动管理上下文内存的任何尝试几乎总是会引起超出其解决范围的问题。

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

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

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

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

如果泄漏完全在核心数据堆栈中,则您的问题很可能是在self实体和self.image实体之间的实体图中。 实体图防止一个或另一个被拒绝或所需的关系删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM