Swift 中的分配工具工具未提供足够详细的信息

Allocations instrument tool in Swift not providing detailed enough information

我正在尝试使用分配工具来分析 Swift 2 iOS 应用程序。我这样做是这样的:

  1. 运行 使用分配工具的应用程序。
  2. 应用程序启动后,我等待 10 秒并点击 "Mark generations"
  3. 我打开屏幕我怀疑有内存泄漏,等待 10 秒,关闭它,再等一会儿,然后点击 "Mark generations"

至此,我查看二代,看到了从未释放过的对象。我的麻烦是最大的罪犯总是 "main",它没有指向任何特定的 类 或方法

如上所示,"main" 造成了将近 80% 的内存泄漏,但堆栈跟踪并未指向特定的任何地方,这与它下面指向特定方法的泄漏不同。

我不确定这是否相关,但是当我转到“文件”->“符号”时,我显示了一个缺失的符号,如下所示。但是,我在我的机器上的任何地方都找不到这个符号:

我的问题是:"main" 占用这么多内存是否正常,或者是我配置错误导致我看不到真正的堆栈跟踪?

所以有几件事需要考虑。

1:要了解哪些对象已分配但从未释放,您应该考虑使用分配摘要而不是生成。要找到“分配摘要”,请查看“详细信息”按钮旁边的“世代”。单击 Generations,然后切换到 Statistics。然后在搜索栏中输入您的应用程序名称(在我的例子中是 Fleet。),Instruments 将过滤分配给您创建的对象。请参阅下面的示例,了解屏幕的外观。

example

现在,要查明一个对象是否还没有被释放,您需要查看 Persistent 和 Transient 列。 Persistent 列显示当前存在的对象数,而 Transient 列显示已存在但已被释放的对象数。因此,如果您希望某个对象被释放,但 Transient 列中的数字没有改变,那么您就知道该对象尚未被释放,您遇到了问题!

2:如果您仍然想使用 Generations 来找出占用所有内存的内容,您可以取消选中 Invert Call Tree & Hide System Libraries 选项。例如,在我的屏幕上(如下所示),您会看到 main 占用了 A 代分配内存的 76.5%。向下钻取我能够发现大部分分配(45.2%)都分配给了 UIImages。

example

有关 Instruments 的更多详细信息和精彩教程,请参阅: https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started

希望对您有所帮助!

总结一下上面的讨论,"main" 无法点击的原因是因为选择了 "invert call tree" 选项。取消选中 "invert call tree" 可解决问题。