仪器:泄漏和分配(tvOS)

时间:2017-02-01 11:58:59

标签: ios swift memory-leaks instruments tvos

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

该应用程序不断循环播放一组全屏幻灯片。在屏幕的底部有一个包含10篇文章的自动收报机(每10秒更新一次 - 现在在开发期间)。下面是天气幻灯片的截图,以便了解。

Screenshot

目前该应用程序在一段时间后崩溃,我很确定我已将其缩小到自动收报机组件(当禁用它时,应用程序可以存活数天)。如果我使用Instruments中的'Leaks'预设,我会得到以下结果: Leaks  看起来它正在泄漏文章实例。我每隔10秒重新创建一次文章实例,并将它们提供给自动收录器组件。我想这就是为什么新实例每隔10秒就会泄漏一次。

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

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

但该应用程序仍然崩溃。

我已经阅读了很多关于保留周期的内容,在我认为我应该实施的情况下实施弱/无主。

所以我的问题不是关于代码,而是更多关于如何读取这些数据,Leak在这个上下文中意味着什么,以及为什么我看到这些'泄漏'不是分配中的持久对象窗口?

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

2 个答案:

答案 0 :(得分:1)

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

至于“泄漏”在这种情况下意味着什么,它总是意味着:您的计算机没有释放内存资源。它可能看起来有所不同,因为我们习惯于把泄漏想象成以更快的速度通过内存吃掉的东西(比如在四个核心上运行的无限循环,或某种东西),但这种泄漏实际上是相同的事情;你的速度慢了。

答案 1 :(得分:0)

经过几周的努力,我想找出问题所在。好消息,我找到了我的泄漏,并解决了它!

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

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