仪器:泄漏和分配 (tvOS)
Instruments: Leaks and Allocations (tvOS)
我目前正在开发 tvOS 应用程序。这是我的第一个原生 (Swift) 应用程序。该应用程序将是一个数字标牌应用程序,在活动期间或公司办公室使用。
与 iOS/tvOS 上的典型应用程序相比,一个很大的区别是它需要 运行 几乎 24/7,因此内存是这个应用程序的一个大主题。最小的泄漏最终会导致应用程序崩溃。
该应用不断循环播放一组全屏幻灯片。在屏幕底部有一个包含 10 篇文章的滚动条(每 10 秒刷新一次 - 现在正在开发中)。下面是天气幻灯片的屏幕截图,以了解一下。

目前应用程序在一段时间后崩溃,我很确定我已经将它缩小到代码组件(禁用它时,应用程序可以使用几天)。如果我在 Instruments 中使用“Leaks”预设,我会得到以下结果:

看起来它正在泄漏 Article 实例。我每 10 秒重新创建一次 Article 实例,并将它们提供给 ticker 组件。我认为这就是为什么新实例每 ~10 秒泄漏一次的原因。
在我开始使用 Instruments 中的“Leaks”预设之前,我使用了“Allocations”预设,而使用它对我来说一切都很好。但我可能误读了结果……
使用分配:

我读这篇文章的方式是,目前内存中存在 10 个 Article 实例,还有 31 个已经存在但现在已清理 - 所以我很安全。
但应用程序仍然崩溃。
我读了很多关于保留周期的文章,在我认为应该实现的地方实现了weak/unowned。
所以我的问题与其说是关于代码,不如说是关于如何读取这些数据,泄漏在这种情况下意味着什么,以及为什么我在 分配 window?
(测试在多个设备+模拟器上完成)
如果您看到 Instruments 中的内存使用量稳定增加(即大约 n GB/分钟或小时),这是一个很好的迹象,表明正在创建对象,但没有释放对象。你对弱变量和无主变量的暗示让我认为你知道这一点,但你可能没有找到泄漏的所有来源。我建议在 Instruments 中进行几代总结,并查看堆分配中的特定 classes/objects。您的问题 类 数量会稳步增加,而且可能永远不会减少。尝试从那里调试问题。
至于 'leak' 在此上下文中的含义,它始终表示:您的计算机未释放内存资源。它可能看起来不同,因为我们习惯于将泄漏视为某种以更快的速度吞噬内存的东西(例如四核上的无限循环 运行 等),但那种泄漏和这种实际上是同一件事;你的速度比较慢。
我在数周后试图找出问题所在后回来了。好消息,我找到了漏洞并解决了!
该问题已通过删除另一个闭包中的闭包来解决,该闭包保留对第一个闭包中的变量的引用。这导致了一个保留周期。
真不明白为什么没有早点找到,我在这里问了一个新问题:getting-different-data-in-instruments-based-on-method-of-profiling.
我目前正在开发 tvOS 应用程序。这是我的第一个原生 (Swift) 应用程序。该应用程序将是一个数字标牌应用程序,在活动期间或公司办公室使用。 与 iOS/tvOS 上的典型应用程序相比,一个很大的区别是它需要 运行 几乎 24/7,因此内存是这个应用程序的一个大主题。最小的泄漏最终会导致应用程序崩溃。
该应用不断循环播放一组全屏幻灯片。在屏幕底部有一个包含 10 篇文章的滚动条(每 10 秒刷新一次 - 现在正在开发中)。下面是天气幻灯片的屏幕截图,以了解一下。

目前应用程序在一段时间后崩溃,我很确定我已经将它缩小到代码组件(禁用它时,应用程序可以使用几天)。如果我在 Instruments 中使用“Leaks”预设,我会得到以下结果:
在我开始使用 Instruments 中的“Leaks”预设之前,我使用了“Allocations”预设,而使用它对我来说一切都很好。但我可能误读了结果……
使用分配:
但应用程序仍然崩溃。
我读了很多关于保留周期的文章,在我认为应该实现的地方实现了weak/unowned。
所以我的问题与其说是关于代码,不如说是关于如何读取这些数据,泄漏在这种情况下意味着什么,以及为什么我在 分配 window?
(测试在多个设备+模拟器上完成)
如果您看到 Instruments 中的内存使用量稳定增加(即大约 n GB/分钟或小时),这是一个很好的迹象,表明正在创建对象,但没有释放对象。你对弱变量和无主变量的暗示让我认为你知道这一点,但你可能没有找到泄漏的所有来源。我建议在 Instruments 中进行几代总结,并查看堆分配中的特定 classes/objects。您的问题 类 数量会稳步增加,而且可能永远不会减少。尝试从那里调试问题。
至于 'leak' 在此上下文中的含义,它始终表示:您的计算机未释放内存资源。它可能看起来不同,因为我们习惯于将泄漏视为某种以更快的速度吞噬内存的东西(例如四核上的无限循环 运行 等),但那种泄漏和这种实际上是同一件事;你的速度比较慢。
我在数周后试图找出问题所在后回来了。好消息,我找到了漏洞并解决了!
该问题已通过删除另一个闭包中的闭包来解决,该闭包保留对第一个闭包中的变量的引用。这导致了一个保留周期。
真不明白为什么没有早点找到,我在这里问了一个新问题:getting-different-data-in-instruments-based-on-method-of-profiling.