Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 保留核心数据的周期_Ios_Core Data_Memory Management_Retain - Fatal编程技术网

Ios 保留核心数据的周期

Ios 保留核心数据的周期,ios,core-data,memory-management,retain,Ios,Core Data,Memory Management,Retain,我想我有一个问题,可能与核心数据的保留周期有关。 代码为follow,其中self.image也是NSManagedObject: - (void)setImage:(UIImage*)image1 andThumbnail:(UIImage*)image2 { self.image.data = UIImageJPEGRepresentation(image1, 0.85); // This is autoreleased self.thumbnail = UIImageJPE

我想我有一个问题,可能与核心数据的保留周期有关。 代码为follow,其中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=”有一个retain从未发布过(我认为它介于self.image和self之间)。因此,自我对象永远不会被释放,因此泄漏

编辑:所以基本上我和这里有相同的问题: 我使用的结构与前面代码中的self对应于给定链接中的条的结构完全相同。我也有相同的视图控制器结构。但是,refreshObject没有帮助

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


谢谢

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

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

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

显然,“self.image.date=” 有一个是永远不会被释放的吗 (我认为是介于 自我形象和自我意识)。因此 自我对象永远不会被释放 这就是漏洞

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

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


如果泄漏根本就在核心数据堆栈中,那么问题最有可能出现在
self
实体和
self.image
实体之间的实体图中。实体图正在阻止一个或另一个被删除,很可能是由于拒绝或所需的关系。

我不删除实体。实际上,我通过使用refreshObject:on the self.image解决了这个问题。如果没有这一点,我想我会一直在self和self.image之间保持一个retain循环,这仅仅是因为它们之间的相互关系。我不确定您的问题是什么,但仅仅将NSData实例保存到托管对象中不应该导致泄漏。这是一种非常常见的操作。