【问题标题】:Core Data never release NSData loaded from external storageCore Data 从不释放从外部存储加载的 NSData
【发布时间】:2013-02-16 12:06:49
【问题描述】:

所以我使用Core Data 来存储一些图像。 (同样子类是用最新的mogenerator生成的)

(我也在使用 ARC)

是的,我知道我可以保留一个引用并将其存储在磁盘上,但我想:

“嘿,他们做了一个选择,所以我可以做到这一点,而无需自己管理!”

所以我试了一下,它运行良好,除了以这种方式加载的所有数据从未发布



在负责显示图像的 ViewController 的初始化中,我给它通常的 main NSManagedObjectContext

viewDidAppear 中调用的方法中,我使用图像设置了UIScrollView

编辑: 所以这不是一个真正的获取请求我有一个Entity1,它与图像有一对多,我用它来获取图像 我从相同的上下文中得到了这个 entity1。我只是想简化以更好地解释。

- (void)setupScrollViewWithEntity1:(Entity1 *)entity1 {
    DDLogVerbose(@"-- %@ : SETUP SCROLL VIEW --", self);
    // I remove any previous subviews
    [self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    self.scrollView.contentSize = self.scrollView.frame.size;

    /* Here I get the imagesArray with a NSFetchRequest */ 
    //So it's not really a fetch request I have an `Entity1` which have one-to-many with images and I use it to get the images
    NSSet *imagesSet = entity1.images;


    // So I have an NSArray holding all the Image object
    for (Image *image in imagesSet) {
        CGRect frame = self.scrollView.frame;
        frame.origin.x = image.numberValue*frame.size.width;
        UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:frame];
        scrollView.contentSize = self.scrollView.frame.size;
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.scrollView.frame];
        imageView.image = [UIImage imageWithData:image.image];
        imageView.contentMode = UIViewContentModeScaleAspectFit;
        imageView.userInteractionEnabled = YES;
        [scrollView addSubview:imageView];
        scrollView.delegate = self;
        scrollView.minimumZoomScale = 1.0;
        scrollView.maximumZoomScale = 3.0;
        [self.scrollView addSubview:scrollView];
    }
}

}

viewWillDisappear 中,我保存了NSManagedObjectContext,我希望当控制器被释放时,所有数据也会被释放,但它会永远保留在内存中。

这条线莫名其妙地保留了它不知道为什么:imageView.image = [UIImage imageWithData:image.image];

我花了 3 天时间尝试使用所有东西,Instruments,重新检查了我是否没有在某处保留强引用。

问题是UIViewController 得到dealloc'ed 我可以肯定,我在Instruments 中使用Allocation 工具看到它,但由于某种原因,数据会永远保留在内存中,直到应用程序 崩溃。


这是内存中未解除分配的约 20 个图像的列表:


这是第一个对象的详细信息:

感谢您阅读到这里,我真的很绝望:(

【问题讨论】:

  • 是的,我忘了提它,但我标记了它让我编辑它
  • 托管对象上下文是否存在于视图控制器之外?如果是这样,您是否有可能只是获得了一个带有循环引用的对象图,而您却没有明确地 [重新] 错误地处理您的对象?
  • 您是否尝试过 refreshObject:mergeChanges 故障对象?另外,你是如何确认你的视图控制器被释放的?
  • @Tommy 是的,托管对象上下文在它的主要/默认上下文中仍然存在,我将如何进行这样的循环引用?可能只是我不明白你的意思。
  • @Clarisse Core Data 喜欢具有逆向关系,Core Data 关系是强引用。所以他们基本上总是保持循环。但如果你已经在做一些及时的refreshObject:mergeChanges:,那么你已经被覆盖了。

标签: iphone ios objective-c core-data automatic-ref-counting


【解决方案1】:

您是否在完成图像处理后尝试在NSManagedObjectContext 上拨打reset?这会从内存对象图中逐出任何已加载的对象。下次需要它们时,需要从磁盘/数据库中获取它们。

【讨论】:

  • 太奇怪了,我确信我已经尝试过了!但它的工作原理非常感谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多