我有以下问题:
我有一个主视图对象(继承自UIView),它以4x4布局显示一个包含16个方格的网格(每个是我创建的继承自UIImageView的类)。
这16个正方形中的每一个都是160x160,并且包含不大于30kb的图像(每个正方形的不同图像)。但是,图像是500x500(因为它在程序的其他地方以其全尺寸使用),因此通过setFrame方法将其在“square”类中调整为160x160。
通过在应用程序运行时查看Xcode的内存管理功能,我注意到了一些事情:
这里的重点是:为什么每个正方形在加载30kb图像时会占用1MB内存?有没有办法减少这个?我尝试过以多种不同的方式创建图片:[UIImage imageNamed:img]
,[UIImage imageWithContentsFromFile:path]
,[UIImage imageWithData:imgData scale:scale]
,以及不调整框架的大小。
答案 0 :(得分:5)
当您在较小的UIImageView
中使用500x500图像时,它仍然会将较大的图像加载到内存中。您可以通过调整UIImage
本身(不仅调整frame
的{{1}}),制作160x160图像,并在视图中使用该图像来解决此问题。有关调整图像大小的代码,请参阅this answer,然后可按如下方式调用:
UIImageView
您甚至可能希望保存已调整大小的图像,因此您不会经常使用每次创建较小图像的计算开销来阻碍自己,例如:
UIImage *smallImage = [image scaleImageToSizeAspectFill:CGSizeMake(160, 160)];
然后,您可以在以后的视图调用中加载与您的小图像对应的PNG文件。
在回答你的问题为什么占用这么多内存时,这是因为虽然图像可能存储为持久存储中的压缩JPG或PNG,但我怀疑它在内存中是一个未压缩的位图。有许多内部格式,但常见的是32位格式,每个格式有8位,分别用于红色,绿色,蓝色和alpha。无论具体细节如何,您都可以快速了解500 x 500像素表示,每像素4个字节可以转换为1 MB内存。但160 x 160的图像大小应该是其大小的十分之一。