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

时间:2016-06-16 20:20:52

标签: ios swift instruments

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

  1. 使用分配工具运行应用。
  2. 应用程序启动后,我等待10秒并点击“Mark generations”
  3. 我打开屏幕,我怀疑有内存泄漏,等待10秒,关闭它,等待一些,然后点击“Mark generation”
  4. 此时,我会看第二代看到从未发布的对象。我的麻烦是,最大的罪犯总是只是“主要”,这并不指向任何特定的类或方法 enter image description here

    如上所述,“main”导致几乎80%的内存泄漏,但堆栈跟踪并不指向任何特定的位置,不像下面的泄漏指向特定的方法。

    我不确定这是否相关,但是当我转到File - >符号,我正在显示一个缺少的符号,就像这样。但是,我无法在我的机器上的任何位置找到此符号: enter image description here

    我的问题是:对于这个“主要”来说,保留这么多内存是不正常的,还是在我无法看到真正的堆栈跟踪的地方错误配置了什么?

2 个答案:

答案 0 :(得分:2)

所以要考虑几件事。

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

example

现在,要查明对象是否尚未释放,您需要查看Persistent和Transient列。 “持久”列显示当前存在的对象数,而“瞬态”列显示已存在但已取消分配的对象数。因此,如果您希望取消分配对象,但Transient列中的数字不会更改,那么您知道该对象尚未被释放并且您遇到了问题!

2:如果您仍想使用Generations来确定占用所有内存的内容,您可以取消选中Invert Call Tree&隐藏系统库选项。例如,在我的屏幕上(如下所示),您将看到主要占据A组分配内存的76.5%。向下钻取我能够发现大部分分配(45.2%)用于UIImages。

example

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

希望这有帮助!

答案 1 :(得分:0)

总结上面的讨论,“主要”无法点击的原因是因为选择了“反向调用树”选项。取消选中“反转调用树”可以解决问题。