我的应用正在保存并从Parse.com检索数据。并显示图像,按钮,滚动视图等。(正常的东西)。然后,当我接近完成我的应用程序时,它开始收到内存警告,应用程序开始经常崩溃。我在仪器中检查了它,并注意到某些点的实时字节非常高,我无法弄清楚原因。
由于实时字节数较高,应用程序是否崩溃?活字节的值应该是什么?
VM中正在发生一些事情。但我不知道这是什么。什么是VM: CG raster data
?这个:VM: CG Image
?我没有使用CGImages
UIImages
答案 0 :(得分:3)
由于实时字节数较高,应用程序是否崩溃?
是
活字节的值应该是什么?
没有固定号码。限制从操作系统版本更改为操作系统版本,有时取决于设备以及当前还有什么。正确的做法是(a)尽量不要使用这么多,并且(b)留意警告并处理你不需要的东西。
VM中正在发生一些事情。但我不知道这是什么。什么是VM:CG栅格数据?而这:VM:CG Image?我没有使用CGImages只有UIImages
UIImage
只是CGImage
的包装。
你有太多的图像同时存在。这就是你必须解决的问题。
那么,有多少太多了?这取决于它们有多大。
另外,请注意"栅格数据"是解压缩大小。 5Mpix RGBA 8bpp图像的光栅数据需要20MB RAM,无论文件是8MB还是8KB。
我仍然觉得这个数字太高了,或者是30-40 MB的okey数字,一次处理3-6个全屏大小的图像?这是在4岁的iPhone4,iOS 7上测试的。如果这很重要。
在iPhone 4上,"全屏"表示640x960像素。 8bpp RGBA表示每像素4个字节。因此,对于6个这样的图像,该640×960×4×6 = 14MB。因此,如果您已经加载并绘制了6张全屏图像,那么这是您应该期望的绝对最小存储空间。
那么,为什么你实际上看到了两倍多呢?
好吧,正如班级参考中的Images and Memory Management所说:
在内存不足的情况下,可以从UIImage对象中清除图像数据以释放系统上的内存。此清除行为仅影响UIImage对象内部存储的图像数据,而不影响对象本身。当您尝试绘制其数据已被清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这个额外的负载步骤可能会导致很小的性能损失。
因此,想想14MB基本上是iOS用来加速的缓存,以防你想再次绘制图像。如果内存运行有点低,它会自动清除缓存,因此您不必担心。
因此,这会留下16-24MB,这可能是由UI小部件和图层的缓冲区以及幕后的合成器使用的。这比理论上的最小值14MB略高,但并非如此。
如果您想进一步减少内存使用量,您可能需要做的就是不绘制所有6个图像。如果他们全屏显示,则用户无法一次看到超过1或2个。所以,你可以按需加载和渲染它们而不是预加载它们(或者,如果你可以预测下一个通常需要哪一个,预加载它们中的一个而不是所有它们),并在它们“不”时将它们销毁。更长的可见。由于您只有2个图像而不是6个图像,因此应将内存使用量从16-24MB + 14MB缓存降至5-9MB + 5MB缓存。这显然意味着更多的CPU - 它可能不会明显影响响应能力或电池消耗,但你想要测试它。而且,更重要的是,它肯定会使您的代码更加复杂。
显然,如果它适用于您的图像,您还可以执行诸如使用非Retina图像(将内存减少75%)或将颜色深度从RGBA-8降低到ARGB-1555(50 %),但大多数图像看起来都不那么好(这就是为什么我们有高色Retina显示器。)