5

所以我Core Data用来存储一些图像。(子类也是用 latest 生成的mogenerator

(而且我也在使用 ARC)

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

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

所以我试了一下,它工作得很好,除了所有以这种方式加载的数据永远不会被释放


在此处输入图像描述

在此处输入图像描述


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

在我调用的方法中,viewDidAppearUIScrollView使用图像设置:

编辑:所以这不是一个真正的获取请求,我有一个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看到了它,但由于某种原因,数据永远保留在内存中,直到应用程序崩溃deallocInstrumentsAllocation


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

在此处输入图像描述


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

在此处输入图像描述

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

4

1 回答 1

2

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

于 2013-03-02T00:38:31.817 回答