Ios 由于内存压力,应用程序持续崩溃

Ios 由于内存压力,应用程序持续崩溃,ios,objective-c,cocoa-touch,memory,xcode-instruments,Ios,Objective C,Cocoa Touch,Memory,Xcode Instruments,我的应用程序正在从Parse.com保存和检索数据。以及显示图像、按钮、滚动视图等。。(正常的东西)。然后,当我快完成我的应用程序时,它开始收到内存警告,应用程序开始频繁崩溃。我在仪器中检查了一下,发现在某些点上活动字节非常高,我不知道为什么 应用程序是否因为高活动字节而崩溃?活动字节的值应该是多少 很明显,虚拟机中发生了一些事情。但我不知道这是什么。什么是VM:CG光栅数据?这个:VM:CG图像?我没有只使用UIImages 应用程序是否因为高活动字节而崩溃 对 活动字节的值应该是多少 没

我的应用程序正在从Parse.com保存和检索数据。以及显示图像、按钮、滚动视图等。。(正常的东西)。然后,当我快完成我的应用程序时,它开始收到内存警告,应用程序开始频繁崩溃。我在仪器中检查了一下,发现在某些点上活动字节非常高,我不知道为什么

应用程序是否因为高活动字节而崩溃?活动字节的值应该是多少

很明显,虚拟机中发生了一些事情。但我不知道这是什么。什么是
VM:CG光栅数据
?这个:
VM:CG图像
?我没有只使用
UIImages

应用程序是否因为高活动字节而崩溃

活动字节的值应该是多少

没有固定的号码。限制会随着操作系统版本的不同而变化,有时还取决于设备和当前正在发生的其他事情。正确的做法是(a)尽量不要使用太多,以及(b)听从警告,处理你不需要的东西

很明显,虚拟机中发生了一些事情。但我不知道这是什么。什么是VM:CG光栅数据?这个:VM:CG图像?我使用的不是CGImages,而是UIImages

A只是
CGImage
的包装器

您同时有太多图像处于活动状态。这就是你必须解决的问题

那么,多少是太多了?这取决于它们有多大

另外,请注意,“光栅数据”是解压缩后的大小。5Mpix RGBA 8bpp图像的光栅数据需要20MB的RAM,无论文件是8MB还是8KB


我仍然觉得这个数字太高了,或者30-40MB是一个一次处理3-6个全屏大小图像的好数字吗?这是在4年前的iPhone4、iOS 7上测试的。如果这很重要的话

在iPhone4上,“全屏”意味着640x960像素。8bpp RGBA表示每像素4字节。因此,有6个这样的图像,即640*960*4*6=14MB。因此,如果您已经加载并绘制了6幅全屏图像,那么这就是您应该期望的绝对最小存储空间

那么,为什么你真的看到了两倍以上呢

正如课堂参考资料中所说:

在内存不足的情况下,可以从UIImage对象中清除图像数据,以释放系统上的内存。此清除行为仅影响UIImage对象内部存储的图像数据,而不影响对象本身。尝试绘制数据已清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这一额外的加载步骤可能会导致较小的性能损失

因此,可以把14MB想象成iOS用来加速的缓存,以防你想再次绘制图像。如果您的内存有点不足,它会自动清除缓存,所以您不必担心

因此,这就给您留下了16-24MB,这大概是UI小部件和层的缓冲区以及幕后的合成器所使用的。这比理论上14MB的最小值稍微高一点,但并不可怕

如果您想进一步减少内存使用,您可能需要做的是不绘制所有6幅图像。如果它们是全屏的,用户不可能一次看到超过1或2个。因此,您可以按需加载和渲染它们,而不是预加载它们(或者,如果您可以预测下一步通常需要哪一个,则预加载其中的一个而不是所有),并在它们不再可见时销毁它们。因为这样您就只有2个映像而不是6个映像,所以您的内存使用量应该会从16-24MB+14MB缓存下降到5-9MB+5MB缓存。这显然意味着更多的CPU—它可能不会明显影响响应能力或电池电量消耗,但您需要对此进行测试。而且,更重要的是,它肯定会使您的代码更加复杂


显然,如果适合您的图像,您也可以使用非视网膜图像(这将减少75%的内存)或将颜色深度从RGBA-8降低到ARGB-1555(50%),但大多数图像在这种情况下看起来不太好(这就是为什么我们有高颜色视网膜显示).

当你的应用程序崩溃时,控制台会显示什么异常情况?@Tommy:我在发布评论之前已经做了同样的编辑…@abarnert这里没有显示;我猜是某种无害的阿贾克斯竞赛条件。由于还没有发现你的答案,我认为你太新了,没有编辑权限。汤米:没什么大不了的。是的,它是完全无害的;如果查看编辑历史记录,则表明您未成功执行任何操作。:。。。或者他还有一个合理的数字,但他没有发现他正在获取的所有图像都是500万像素。@Tommy:好吧,如果你想在3G-s上处理5Mpix图像,“合理”的数字要比在5s上处理QVGA图像的数字小得多。:)所以问题可能是我从Parse.com获取的图像可能太大了?@Peter:一句话,是的。但是在我的第一张图片中,使用VM:CG光栅数据,你认为这也是图像吗?