【问题标题】:ios - Heap growth with ARC onios - 启用 ARC 的堆增长
【发布时间】:2013-07-19 01:15:43
【问题描述】:

发现每次运行一种更新数据和 UI 的方法时都会出现堆增长。 这是我在 Inspector 中看到的内容: 每次运行该方法时,都会有大约 1MB 的巨大堆增长。几次通话后应用崩溃。

通过调用栈向下找到这个静态函数:

在代码中找不到任何内存泄漏。请帮忙。 (ARC 开启)

更新:

所以现在我在该静态方法中使用了一个 NSCalendar 对象,它对一些人有所帮助,但每次运行该方法时仍然有 1MB 以上。 现在 Inspector 显示了许多与代码无关的内存地址。

【问题讨论】:

  • 很难说...“dateDifferenceFromDate”肯定不是 1mb 泄漏的原因。可能您的代码中的某些内容保留了您的一些 UI,或者您的代码中有一个保留周期。如果不查看更多代码,我们无能为力。
  • 好吧 - 显然 dateDifferenceFromDate 不是罪魁祸首。当您看到内存峰值时,GraphController::drawGraph 似乎是它的更新 UI。你可以为drawGraph粘贴更多代码吗?
  • 好的。这是pastebin.com/yvvX6GZM又大又脏。但我认为最有趣的是我有这样的属性 @property (nonatomic, retain) UIImageView *drawArea 并且在 drawGraph 结束时我改变了它。
  • @Goga 不要害怕使用辅助方法。把那个庞然大物分开。它将帮助您和以后研究该方法的任何其他人。

标签: ios objective-c xcode memory-leaks abandoned-memory


【解决方案1】:

您不需要创建这么多NSCalendars - 如果您重用 autoupdatingCurrentCalendar(例如将其保存到 GraphController ivar)并将其传递给 -dateDifferenceFromDate:to:,您可以(实际上)消除日历创作。

更新

这对废弃的内存有帮助还是只是提高速度?

了解此建议有多大帮助的最佳方法是衡量。您的屏幕截图表明 ICU 时区(由日历使用)创建是最重的部分。 IDK 在绘制图形时您调用了多少次(即您创建了多少 NSCalendars,或者实现是否通过此 API 共享/缓存信息)……但是您提供的信息让我相信它是“很多”-每次调用 -dateDifferenceFromDate:to: 时,需要一个日历。

所以是的,它可以消除(不必要的)重复对象——[NSCalendar currentCalendar] 不会返回单例(您的示例证明了这一点)。

还要注意NSDateComponents 可能会引用日历实例。

创建日历可能非常耗时(不仅仅是内存)。

还要注意NSCalendar 不是线程安全的。

因此,您的程序可能会不必要地创建大量临时变量。大多数(如果不是全部)内存将“很快”释放,但如果您有很多“计算”,那么您的自动释放池中可能会有大量存款(最终会被耗尽)。您可以创建内部自动释放池来减少这种情况,但使用一个日历可以轻松优化速度和内存。

许多系统 API 在后台缓存并导致令人惊讶的内存增长,但 IDK 如果这是其中之一。

这篇博文可能也很有趣:http://www.mikeabdullah.net/NSCalendar_currentCalendar.html

但实际上,我只是尝试使用一个自动更新日历,然后进行测量。然后你就会知道它对你的实施有多大帮助。

【讨论】:

  • 这对废弃的内存有帮助还是只是提高速度?
  • 有所帮助,但似乎这不是主要问题。请看我的更新。
  • @Goga 对所提供的信息帮助不大——符号化会有所帮助。
【解决方案2】:

内存“泄漏”不是导致崩溃的原因。很明显,内存是由 ARC 回收的。您能告诉我们有关崩溃的情况吗?

【讨论】:

  • 为什么不呢?一切都很好而且超级快,但是如果我重复更新(大约 5 次)它就会崩溃。
【解决方案3】:

问题不在于 dateFormatter。这是它的容器额外保留。出于某种原因,我在控制器上调用 setParentView

有帮助的答案: https://stackoverflow.com/a/17767593/1974008

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2011-03-23
    • 2013-11-28
    • 2012-08-10
    • 2012-05-13
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多