【问题标题】:Instruments: Leaks and Allocations (tvOS)工具:泄漏和分配 (tvOS)
【发布时间】:2017-06-18 04:03:44
【问题描述】:

我目前正在开发一款 tvOS 应用。这是我的第一个本机 (Swift) 应用程序。该应用程序将是一个数字标牌应用程序,在活动期间或公司办公室使用。 与 iOS/tvOS 上的典型应用程序相比,一个很大的不同是它需要几乎 24/7 运行,因此内存是这个应用程序的一个重要主题。最小的泄漏最终会导致应用崩溃。

该应用不断循环播放一组全屏幻灯片。在屏幕底部有一个包含 10 篇文章的代码(每 10 秒刷新一次 - 现在正在开发中)。下面是天气幻灯片的屏幕截图,供大家参考。

目前,应用程序在一段时间后崩溃,我很确定我已将其范围缩小到股票代码组件(禁用它时,应用程序会存活数天)。如果我在 Instruments 中使用“Leaks”预设,我会得到以下结果:  看起来它正在泄漏文章实例。我每 10 秒重新创建一次 Article 实例,并将它们提供给 ticker 组件。我认为这就是为什么新实例每隔约 10 秒就会泄漏一次。

在我开始使用 Instruments 中的“Leaks”预设之前,我使用了“Allocations”预设,而使用这一切对我来说似乎都很好。但我可能误读了结果……

使用分配:  我读到这篇文章的方式是,目前内存中存在 10 个 Article 实例,其中 31 个已存在但现在已清理 - 所以我很安全。

但应用仍然崩溃。

我已经阅读了很多关于保留周期的文章,在我认为应该的地方实施了弱/无主。

所以我的问题不是关于代码,而是更多关于如何读取这些数据,在这种情况下泄漏意味着什么,以及为什么我认为这些“泄漏”不是在分配中的持久对象 窗口?

(测试在多台设备+模拟器上完成)

【问题讨论】:

    标签: ios swift memory-leaks instruments tvos


    【解决方案1】:

    几周后我回来了,试图找出问题所在。好消息,我发现了我的漏洞并解决了它!

    通过删除另一个闭包中的闭包来解决该问题,并在第一个闭包中保留对变量的引用。这导致了一个保留周期。

    我真的不明白为什么我没有早点找到它,我在这里问了一个新问题:getting-different-data-in-instruments-based-on-method-of-profiling

    【讨论】:

      【解决方案2】:

      如果您看到 Instruments 中的内存使用量稳定增加(即大约 n GB / 分钟或小时),则表明对象正在创建,但未释放。您对弱和无主变量的暗示让我认为您知道这一点,但您可能没有找到泄漏的所有来源。我建议在 Instruments 中获取几代摘要,并查看堆分配中的特定类/对象。您的问题课程数量将稳步增加,并且可能永远不会减少。尝试从那里调试问题。

      至于“泄漏”在这种情况下的含义,它始终意味着:您的计算机没有释放内存资源。看起来可能不同,因为我们习惯于将泄漏视为以更快的速度吞噬内存的东西(例如在四个内核上运行的无限循环或其他东西),但这种泄漏实际上是相同的事物;你的慢一点。

      【讨论】:

      • 但是持久对象的数量(在分配屏幕截图中)随着时间的推移保持稳定,这是否意味着我的对象没有泄漏?为什么此信息与我在“泄漏”屏幕中看到的不同?
      • 不一定。我只在 3 个不同的应用程序上运行了全堆分配测试来查找泄漏,每个应用程序都在摘要中告诉我一个类似的故事。我不知道 Instruments 如何确定“持久”对象是什么,很抱歉我在这方面无法提供更多帮助。在更详细的生成报告中,在每种情况下,视图、视图控制器和其他一些对象的总数在应用程序的生命周期中持续上升。可以肯定的是,我建议至少运行几次。
      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2011-10-15
      • 2011-10-29
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2016-09-12
      相关资源
      最近更新 更多