我正在尝试使用分配工具来分析Swift 2 iOS应用。我这样做是这样的:
此时,我会看第二代看到从未发布的对象。我的麻烦是,最大的罪犯总是只是“主要”,这并不指向任何特定的类或方法
如上所述,“main”导致几乎80%的内存泄漏,但堆栈跟踪并不指向任何特定的位置,不像下面的泄漏指向特定的方法。
我不确定这是否相关,但是当我转到File - >符号,我正在显示一个缺少的符号,就像这样。但是,我无法在我的机器上的任何位置找到此符号:
我的问题是:对于这个“主要”来说,保留这么多内存是不正常的,还是在我无法看到真正的堆栈跟踪的地方错误配置了什么?
答案 0 :(得分:2)
所以要考虑几件事。
1:为了了解分配了哪些对象然后从未发布过,您应该考虑使用分配摘要而不是代。要查找“分配摘要”,请在“详细信息”按钮旁边查看“生成”。单击Generations,然后切换到Statistics。然后在搜索栏中输入您的应用程序名称(在我的案例中为Fleet。),Instruments会将分配过滤到您创建的对象。请参阅下面的屏幕示例。
现在,要查明对象是否尚未释放,您需要查看Persistent和Transient列。 “持久”列显示当前存在的对象数,而“瞬态”列显示已存在但已取消分配的对象数。因此,如果您希望取消分配对象,但Transient列中的数字不会更改,那么您知道该对象尚未被释放并且您遇到了问题!
2:如果您仍想使用Generations来确定占用所有内存的内容,您可以取消选中Invert Call Tree&隐藏系统库选项。例如,在我的屏幕上(如下所示),您将看到主要占据A组分配内存的76.5%。向下钻取我能够发现大部分分配(45.2%)用于UIImages。
有关更多详细信息和有关仪器的精彩教程,请参阅: https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started
希望这有帮助!
答案 1 :(得分:0)
总结上面的讨论,“主要”无法点击的原因是因为选择了“反向调用树”选项。取消选中“反转调用树”可以解决问题。