2013-09-26 54 views
4

我有以下问题:普尔存储器管理性能为图像上IOS设备

我有一个主视图对象(即从UIView的继承),其显示的16个正方形的栅格(每个是我创建的继承的类从UIImageView),在4x4布局。

这16个方格中的每一个都是160x160,并且包含一个不大于30kb的图像(每个方格的图像不同)。然而,该图像是500x500(因为它在程序中的其他地方以其全尺寸使用),所以它通过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],以及不调整帧大小。

回答

5

当您在较小的UIImageView中使用500x500图像时,它仍然会将较大的图像加载到内存中。您可以通过调整UIImage自身(不仅仅调整UIImageViewframe),制作160x160图像并在视图中使用该图像来解决此问题。见this answer一些代码来调整图像大小,然后可以调用如下:

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

你甚至可能要保存调整后的图像,所以你不会经常拖累自己与创造的计算开销较小的图像每一次,如:

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

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


在回答你的问题,为什么它占据了太多的内存,这是因为当图像被作为永久存储压缩JPG或PNG可能存储,我在记忆怀疑它的举行为未压缩的位图。有许多内部格式,但常见的格式是32位格式,每个格式包含8位红色,绿色,蓝色和阿尔法。无论具体情况如何,您都可以快速了解500 x 500像素的表示形式,每个像素4个字节可以转化为1 MB的内存。但160 x 160的图像应该大约为十分之一的大小。

+0

感谢您的快速回答和建议。我最终发现罪魁祸首是启动UIImageView并告诉它调整大小,现在我只是在实例化UIImageView之前动态调整它们的大小,使用UIGraphicsBeginImageContext,调整大小,从当前上下文设置新图像然后是UIGraphicsEndImageContext。这本身就会从1MB /图像降低到150k /图像,或多或少。尽管如此,我还是试试看,看看我能否将内存使用率降到更低。再次,感谢一百万。 – user2491253

+0

这正是我所建议的,即大小图像第一。听起来就像你自己想的那样。做得好!!! – Rob