iOS应用程序崩溃,因为图像使用太多内存

时间:2015-03-24 08:43:41

标签: ios swift

我知道这是一个愚蠢的问题,但这是我必须制作的第一个真正的应用程序,我没有人问,我查找了这个问题,没有发现其他类似的问题。

我的应用程序在真实设备上崩溃,毫无例外。我在模拟器中看到使用了太多内存,过了一段时间我得出的结论是我正在使用的图片应该受到责备。

应用程序的结构是这样的:它有8个viewControllers用于不同的东西:例如,它以一个让用户选择他/她将要玩的头像开始,这里我有两张图片,接下来是一个viewController,显示该头像的统计信息,这里是另一张图片,依此类推。问题是每张图片都使用40MB的RAM进行显示,所以当用户进入游戏所在的gameviewCOntroller时,应用程序会使用超过300MB的RAM。因此,在iPAD 2或iphone 4等设备上崩溃,但在iphone 5上没有崩溃。

我尝试设置图像来自" images.xcassets"来自" .atlas"文件夹,但结果完全一样。图片的尺寸不超过1500x1999像素,它们是png格式。

另外,我看到如果应用程序直接启动到giveViewController它将使用180MB,所以另一个viewController保留在内存或类似的东西。我应该清楚"清楚"他们或类似的东西?

//-------update-------

这是我从仪器获得的: enter image description here

2 个答案:

答案 0 :(得分:5)

内存在移动设备上是一个大问题,你的问题没有明确答案,但我可以给你一些建议:

  • 如果您的图像是纯色或具有对称轴,请使用可调整大小的图像。您可以使用一行像素乘以或高度来覆盖整个屏幕,使用少量内存
  • 图像压缩在解压缩图像时没有效果。因此,如果你有一个600kb的png并且你认为转换为300kb将降低内存使用率仅适用于在内存中解压缩图像时“磁盘空间”的大小为widthXheightXNumber_of_channelXbit_for_channel
  • 调整图像大小:如果将2000px正方形图像加载到内存中并将其显示在800 px square的图像视图中,请在添加之前调整大小。调整大小时只会出现峰值,但稍后会使用较少的内存< / LI>
  • 如果您需要使用大图片,请使用平铺技术,例如CATiledLayer
  • 如果您不再需要图像,请将其删除。可以有一个图像路径数组,但不是一个完整的未压缩图像数组
  • 避免-imageNamed它缓存图像,即使Apple说这个缓存是在内存压力下释放的,你也没有很多控制权来避免崩溃可能为时已晚

这些是一般性建议,如果符合您的要求,则取决于您。

答案 1 :(得分:1)

你一定要遵循安德里亚的建议。 此外,您应该考虑将图像大小设置为您的需要。你说你已经尝试从xcassets设置它们,这样你就可以完全控制你正在加载的图像,这很棒(与下载你无法修改的图像相比)。

我强烈建议您使用资产目录文件read some documentation。这将允许您为更大的屏幕提供高分辨率图像,这些屏幕也具有更多内存,而旧设备则更小,这就是您想要的。

此外,请注意,对于大多数移动设备而言,1500x1999px仍然是一个非常大的尺寸。 有关屏幕尺寸的更多链接: