【问题标题】:App receiving low memory warning but only has 5.7MB of live bytes应用程序收到内存不足警告但只有 5.7MB 的活动字节
【发布时间】:2013-11-15 20:22:22
【问题描述】:

我的应用因重复操作而收到内存不足警告并最终崩溃。当我在仪器中进行分析时,崩溃时我只看到 5.7 MB 的活动字节。 (崩溃显示没有回溯,没有错误等。它只是终止,这表明内存崩溃。)

为什么我的应用程序因内存占用如此之低而崩溃?我一直在 iPad 1 上测试 iOS 5.1。

编辑:
我能够修复崩溃。这是由于对具有 3 个 UIImages 作为属性的对象进行了额外的保留调用。这些对象的堆积导致内存警告和崩溃。

但是,问题仍然存在:为什么 Instruments 显示只有 5.7MB 的活动字节?这可能是由于UIImage's 自动缓存造成的吗?

【问题讨论】:

  • 崩溃可能不是由于内存不足。什么是崩溃错误?
  • 好主意,但没有给出回溯或错误。它只是终止。 (我已在编辑中将此添加到问题中。)
  • 看来您确实应该确定崩溃的确切来源。见My App Crashed, Now What?
  • 另一种想法是,如果您在仪器中添加按钮库“内存监视器”工具,您还可以看到您的内存如何下降
  • 这可能是内存工具本身的问题,因为当 NSMutableString 由于我的逻辑错误而不断增长时,我也发生了类似的事情。我所看到的只是内存警告和应用程序在几次之后崩溃,但当时的内存使用量仅为约 8 MB。症状是内存迅速增长到约 8 MB,在那里保持了大约几分钟,然后警告就来了。一段时间后,应用程序挂起并崩溃,有什么意义吗?

标签: ios iphone xcode memory-management instruments


【解决方案1】:

您是否在环境变量中将 NSZombieEnabled 设置为 YES?

启用僵尸时,内存永远不会真正释放,而是保留在僵尸池中以调试对无效指针的引用。

【讨论】:

    【解决方案2】:

    我在您发布的代码中看不到任何明显的泄漏,但如果您只是想重绘图像(可能是为了强制立即解压缩),那么这是一种非常复杂的方法。只需这样做:

    - (void)loadImage:(UIImage *)image
    {
        UIGraphicsBeginImageContextWithOptions(image.size, image.scale);
        [image drawAtPoint:CGPointZero];
        self.someImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    

    希望这将解决您所看到的任何泄漏。

    【讨论】:

    • 是的,在该方法的中间有很多逐个像素的操作,为了简单起见,我将其删除。当我注释掉该代码时,同样的问题仍然存在,所以我认为它与显示无关。
    猜你喜欢
    • 2012-04-08
    • 2012-01-16
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2011-09-24
    • 2023-03-18
    相关资源
    最近更新 更多