iOS:Instruments 显示 imageio_png_data 的大小比实际图像大小大 300 倍

Posted

技术标签:

【中文标题】iOS:Instruments 显示 imageio_png_data 的大小比实际图像大小大 300 倍【英文标题】:iOS: Instruments shows imageio_png_data is 300x larger in size than its actual image size 【发布时间】:2015-08-11 21:22:26 【问题描述】:

我有一个大小只有 28KB 的图像:

我正在使用此代码将其添加到我的视图中:

  UIImageView *background = [UIImageView new];
  background.frame = CGRectMake(0, 0, 1080, 1920);
  background.image = [UIImage imageNamed:@"Submit.png"];
  [self.view addSubview:background];

现在我在分配图像之前和之后使用仪器分配和“标记生成”进行分析:

Instruments 显示将图像加载到内存需要 7.92MB。 我在其他图像上也看到了同样的问题。 为什么图片只有 28KB,ImageIO_PNG_Data 是 7.92MB?

【问题讨论】:

图像必须解压缩才能在视图中呈现。 【参考方案1】:

@matt 和@dan 确实很好地解释了为什么未压缩的图像应该占用实际 PNG 图像大小的 300 倍的内存来显示在屏幕上。使这个问题变得更糟的是,ios 缓存了这些图像并且永远不会从缓存中释放它们,即使在内存警告时也是如此。

所以这里有一种方法可以防止 iOS 上的图像缓存以节省大量内存,只需使用 imageWithContentsOfFile 而不是 imageNamed:

替换:

background.image = [UIImage imageNamed:@"Submit.png"];

与:

background.image = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/Submit.png"]];

现在 ImageIO_PNG_Data 将在视图控制器关闭时释放。

这里没问题: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/#//apple_ref/occ/clm/UIImage/imageNamed:

如果您有一个只显示一次的图像文件并希望 确保它不会被添加到系统的缓存中,您应该 而是使用 imageWithContentsOfFile: 创建您的图像。这会 将您的一次性图像保留在系统图像缓存之外,可能 改善应用的内存使用特性。

【讨论】:

"并且永远不会从缓存中释放它们,即使出现内存警告也是如此。"我不相信。我认为您的测试方式有问题。或者发生了其他事情。 参见此处:developer.apple.com/library/ios/documentation/UIKit/Reference/…:“此方法不缓存图像对象。”。 @matt - 必须说我没有彻底测试过,所以你很可能是正确的 哦,当然众所周知,imageNamed: 缓存而imageWithContentsOfFile: 没有。这是他们之间的一个重要区别。但是imageNamed: 不会缓存到崩溃的地步!那将是荒谬的。它缓存对您有利(因此再次打开相同的图像很快),而不是对您不利。如果您因为内存不足而崩溃,我不相信您会因为使用imageNamed: 而崩溃。正如我一直所说的,我相信还有其他事情正在发生。 学到了一件事 imageNamed: 缓存,而 imageWithContentsOfFile: 没有,谢谢@matt【参考方案2】:

这是因为 PNG 是描述图像外观的压缩数据,因此纯色的 PNG 很小,因为它易于描述。但是位图是位图 - 只是一个像素网格 - 并且完全取决于图像的尺寸(在你的情况下,它是巨大的)。

【讨论】:

我将文件从 png 转换为 jpg 格式,节省了所有空间。但现在我失去了透明背景,所以这显然不好。是否有处理此问题的首选做法? 你的“问题”是什么意思?到目前为止,您已经描述了正常的世界。有什么问题? 好点。假设我有一个想要显示的全屏图像,例如登录屏幕。如果我可以使用 jpg 图像,它不会占用太多内存,也不会有问题。但是全屏图像的一部分需要透明,所以我必须使用 GIF 或 PNG。但是那些需要解压,解压版比压缩版大 300 倍,每张全屏 png 图像最高可达 8MB。有更好的方法吗? 你说一个 png。 10 个 png 是从哪里来的?到 1920 年,它们怎么可能同时达到 1080?您不可能一次全部显示它们 - 屏幕没有那么大。这是没有意义的。解释一下。 为什么?视图控制器是否泄漏?如果是这样,that 就是您需要提出的问题。是的,图像很大,但是看到它们中的许多不是立即在内存中累积是你的责任。在您的视图控制器上实现deallocdeinit 以记录并查看您的视图控制器实际上在您认为应该不存在的时候已经不存在了。

以上是关于iOS:Instruments 显示 imageio_png_data 的大小比实际图像大小大 300 倍的主要内容,如果未能解决你的问题,请参考以下文章

Instruments(性能调优 12.3)

ios系类教程之用instruments来检验你的app

iOS 内存泄漏检测 Instruments Leaks

iOS 内存泄漏检测 Instruments Leaks

iOS 内存泄漏检测 Instruments Leaks

iOS Instruments:计时器的时间与调用树中的运行时间总和不匹配