【问题标题】:UIImage imageNamed memory leakUIImage imageNamed 内存泄漏
【发布时间】:2013-10-26 13:36:01
【问题描述】:

我试图了解为什么我在 UIImage 和 UIImageView 的一个非常基本的实现中会出现内存泄漏。

在这种情况下我没有使用 ARC(正确禁用)。

我的代码很简单:

UIImage *image = [UIImage imageNamed:@"my_image.jpg"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[[self view] addSubview:imageView];
[imageView release];

我正在 UIViewController 的 viewDidLoad: 方法中实现此代码。

通过调用UIImage的imageNamed:方法,我知道我会得到一个我不拥有的对象/一个自动释放对象。该对象也将被之后实例化的 UIImageView 对象保留。所以我拥有的唯一对象是 UIImageView 对象。

在使用 Memory Leaks Instruments 运行此应用程序后,我得到了这份报告:

我听说过缓存系统在运行,但我不应该有内存泄漏,因为一些数据被缓存了。

这是对带有缓存解释的答案的参考: https://stackoverflow.com/a/2930567/1154501

提前谢谢你!

编辑:也尝试使用 ARC,但我遇到了同样的问题。

【问题讨论】:

  • 我很想知道在使用 ARC 时是否会发生同样的泄漏
  • 我刚试过,ARC也有同样的问题
  • 我猜这是内存泄漏仪器的问题。代码分析器有时也有一些问题。 :)
  • 您的代码示例正在正确处理内存问题。唯一的“问题”是imageNamed 将缓存图像,因此如果它是您在整个应用程序中不需要重复使用的图像,您应该真正使用imageWithContentsOfFile
  • 我并不是说这是导致泄漏的原因。我是说imageNamed 将缓存图像,因此如果您正在查看分配,在由于内存压力清除缓存之前,您不会看到为图像释放的内存。但泄漏是另一回事。坦率地说,我认为这是一个(烦人的)内部 iOS 事情,而不是你的代码,并且考虑到所涉及的内存量可以忽略不计,我不会为此失眠。如果您担心内存使用问题,那么使用 imageNamed 比报告的适度“泄漏”更成问题(除非您确实希望它被缓存)。

标签: ios objective-c memory-leaks uiimageview uiimage


【解决方案1】:

[UIImage imageNamed:] 由操作系统管理。解除分配从此方法创建的 UIImage 可能会释放已分配的内存。如果您有大量图片或用户生成的内容,您应该使用[UIImage imageWithContentsOfFile:][UIImage imageWithData:]

如果您使用 [UIImage imageNamed:] 创建了太多图像,您的应用可能会因为内存使用而被 iOS 杀死。我制作了一个示例应用程序来向自己证明这一点,在此处查看更多信息:iOS UIImage storage formats, memory usage and encoding / decoding

【讨论】:

【解决方案2】:

您是否尝试打开“扩展详细信息”右侧面板并查找内存泄漏的确切行?

您的代码还可以,我的看法是泄漏在其他地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多