gpt4 book ai didi

ios - 保留周期与核心数据

转载 作者:行者123 更新时间:2023-11-28 23:19:07 27 4
gpt4 key购买 nike

我想我有问题,可能与 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。我也有相同的 View Controller 结构。但是,refreshObject 没有帮助。

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

谢谢!

最佳答案

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

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

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

Apparently, the "self.image.date =" has one retain that is never released (and I think that it is between self.image and self). Because of that the self object will never be released and hence the leak.

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

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

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

关于ios - 保留周期与核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122867/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com