【问题标题】:Memory Leak iOS (UIImageView,UIImage,CGImage) not freed on ARC内存泄漏 iOS (UIImageView,UIImage,CGImage) 未在 ARC 上释放
【发布时间】:2013-01-07 05:49:56
【问题描述】:

我正在尝试实现一个简单的视频流,但由于某种原因我的内存不会被释放:

(void)updateImage:(UIImage *)image{
  self.indicator.hidden = TRUE;
  //CGImageRelease([self.imageView.image CGImage]);
  self.imageView.image = nil;
  self.imageView.image = image;
  [self.imageView setNeedsDisplay];
}

如果我使用

CGImageRelease([self.imageView.image CGImage]);

内存将被释放。但是当我返回到以前的视图控制器时,应用程序会崩溃,因为它试图释放为该图像分配的内存,我已经释放了。此方法是从异步任务中调用的,该任务使用以下方法创建图像:

UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CGDataProviderRelease(provider);
CFRelease(data);

据我了解,UIImage 现在拥有 CGImage,我不应该释放它。 那么,当我用新图像更新 UIImageView 时,有没有办法确保 UIImage 被释放?

【问题讨论】:

  • 可能重复:stackoverflow.com/questions/1402148/imagewithcgimage-and-memory(看看我觉得会很有帮助)
  • 是的,在某种程度上。然而,我的问题是 UIImage 没有发布。正如您在上面的代码中看到的那样,我按照线程中的建议小心并释放 CGImage。也许我的问题有点不清楚,如果是这样,请告诉我。

标签: ios memory-leaks uiimageview uiimage automatic-ref-counting


【解决方案1】:

好的,我终于找到了问题所在。

正如我所说,我正在使用一些后台线程来执行图像更新,解决方案是将其添加为自动释放池,如下所示:

   @autoreleasepool {
        [self.delegate performSelectorOnMainThread:@selector(updateImage:) withObject:[self fetchImage] waitUntilDone:NO];
    }

【讨论】:

  • 我认为 autoreleasepool 过度了。真正重要的问题是 performSelectorOnMainThread,所以内存在适当的线程中被释放
  • @Karsten:如果不知道 fetchImage 是做什么的,你就不能假设 @autoreleasepool 是不必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2013-08-19
  • 1970-01-01
  • 2014-06-15
相关资源
最近更新 更多