【发布时间】: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