iOS:仪器显示 imageio_png_data 的尺寸比其实际图像尺寸大 300 倍
iOS: Instruments shows imageio_png_data is 300x larger in size than its actual image size
我有一张只有 28KB 大小的图片:
我正在使用以下代码将其添加到我的视图中:
UIImageView *background = [UIImageView new];
background.frame = CGRectMake(0, 0, 1080, 1920);
background.image = [UIImage imageNamed:@"Submit.png"];
[self.view addSubview:background];
现在我正在使用 Instruments Allocation 和 "Marking Generation" 在分配图像之前和之后进行分析:
仪器表明将图像加载到内存中需要 7.92MB。
我在其他图像上也看到了同样的问题。
为什么 ImageIO_PNG_Data 是 7.92MB 而图片只有 28KB?
这是因为 PNG 是描述图像外观的压缩数据,所以纯色的 PNG 很小,因为它易于描述。但是位图就是位图 - 只是一个像素网格 - 并且完全取决于图像的尺寸(在你的情况下,它是巨大的)。
@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 将在关闭视图控制器时释放。
If you have an image file that will only be displayed once and wish to
ensure that it does not get added to the system’s cache, you should
instead create your image using imageWithContentsOfFile:. This will
keep your single-use image out of the system image cache, potentially
improving the memory use characteristics of your app.
我有一张只有 28KB 大小的图片:
我正在使用以下代码将其添加到我的视图中:
UIImageView *background = [UIImageView new];
background.frame = CGRectMake(0, 0, 1080, 1920);
background.image = [UIImage imageNamed:@"Submit.png"];
[self.view addSubview:background];
现在我正在使用 Instruments Allocation 和 "Marking Generation" 在分配图像之前和之后进行分析:
仪器表明将图像加载到内存中需要 7.92MB。 我在其他图像上也看到了同样的问题。 为什么 ImageIO_PNG_Data 是 7.92MB 而图片只有 28KB?
这是因为 PNG 是描述图像外观的压缩数据,所以纯色的 PNG 很小,因为它易于描述。但是位图就是位图 - 只是一个像素网格 - 并且完全取决于图像的尺寸(在你的情况下,它是巨大的)。
@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 将在关闭视图控制器时释放。
If you have an image file that will only be displayed once and wish to ensure that it does not get added to the system’s cache, you should instead create your image using imageWithContentsOfFile:. This will keep your single-use image out of the system image cache, potentially improving the memory use characteristics of your app.