4

我有以下问题:

我有一个主视图对象(继承自 UIView),它以 4x4 布局显示 16 个正方形的网格(每个都是我创建的继承自 UIImageView 的类)。

这 16 个正方形中的每一个都是 160x160,并且包含不大于 30kb 的图像(每个正方形的不同图像)。然而,图像是 500x500(因为它在程序中的其他地方使用它的完整大小),所以它在“square”类中通过 setFrame 方法调整为 160x160。

通过查看应用程序运行时 Xcode 的内存管理功能,我注意到了一些事情:

  1. 这些方块中的每一个,当添加到主视图对象时,都会将应用程序的内存使用量增加 1MB。这不会在实例化时发生,但只有当它们由 [self addSubview:square] 添加到主视图对象时才会发生。
  2. 如果我对所有正方形使用相同的图像,则内存增加是最小的。如果我在没有任何图像的情况下初始化方形对象,那么增加量基本上为零。
  3. 同一个应用程序在模拟器中运行时使用的内存是实际设备上的 1/6。

这里的重点是:为什么在加载 30kb 的图像时每个方块都占用 1MB 的内存?有没有办法减少这种情况?我尝试过以多种不同的方式创建图像:[UIImage imageNamed:img][UIImage imageWithContentsFromFile:path][UIImage imageWithData:imgData scale:scale],以及不调整框架的大小。

4

1 回答 1

5

当您在较小的 500x500 图像中使用时UIImageView,它仍在将较大的图像加载到内存中。您可以通过调整UIImage, 本身的大小(不仅仅是调整 的frameUIImageView、制作 160x160 图像并在您的视图中使用该图像来解决此问题。有关调整图像大小的代码,请参见此答案,然后可以按如下方式调用:

UIImage *smallImage = [image scaleImageToSizeAspectFill:CGSizeMake(160, 160)];

您甚至可能想要保存调整大小的图像,这样您就不会经常为每次创建较小图像的计算开销而烦恼,例如:

NSData *data = UIImagePNGRepresentation(smallImage);
[data writeToFile:path atomically:YES];

然后,您可以在将来调用视图时加载与您的小图像相对应的 PNG 文件。


在回答你的问题为什么它占用这么多内存时,这是因为虽然图像可能以压缩的 JPG 或 PNG 格式存储在持久存储中,但我怀疑它在内存中是作为未压缩的位图保存的。有许多内部格式,但常见的一种是 32 位格式,红色、绿色、蓝色和 alpha 各 8 位。无论具体细节如何,您都可以快速了解 500 x 500 像素表示,每像素 4 个字节如何转换为 1 mb 的内存。但是 160 x 160 的图像应该大约是其大小的十分之一。

于 2013-09-26T23:34:44.360 回答