Swift中的分配工具工具没有提供足够详细的信息
我正在尝试使用分配工具来剖析Swift 2 iOS应用程序。 我这样做是这样的:
- 使用“分配”工具运行应用程序。
- 一旦应用程序启动,我等待10秒钟,打“马克世代”
- 我打开屏幕我怀疑有内存泄漏,等待10秒钟,closures它,等一下,然后打“Mark世代”
在这一点上,我看着第二代看到从未被释放的物体。 我的麻烦是,最大的罪犯总是只是“主”,这并不指向任何特定的类别或方法
如上所示,“main”几乎占了80%的内存泄漏,但是stacktrace没有指向任何特定的地方,而不像指向特定方法的泄漏。
我不知道这是否相关,但是当我去文件 – >符号,我显示一个失踪的象征,像这样。 但是,我无法在我的机器上find这个符号:
我的问题是:这个“主”是否正常持有这么多的内存,或者是我的端configuration错了,我无法看到真正的堆栈跟踪?
所以有几件事要考虑。
1:要了解什么对象被分配,然后从来没有释放,你应该考虑使用分配总结,而不是几代人。 在详细信息button旁边find“分配汇总”(Geneocation Summary)。 点击Generations,然后切换到Statistics。 然后在search栏input您的应用程序的名称(在我的情况下,Fleet。)和仪器将过滤只分配到您创build的对象。 请参阅下面的屏幕应该是什么样子的例子。
现在,要查明一个对象是否没有被释放,你需要查看Persistent和Transient列。 Persistent列显示当前存在的对象的数量,而Transient列显示已经存在但已被释放的对象的数量。 所以,如果你期望一个对象被解除分配,但是Transient列中的数字没有改变,那么你知道这个对象还没有被释放,并且你有一个问题!
2:如果你仍然想使用Generations来弄清楚什么是占用所有的内存,你可以取消选中Invert Call Tree&Hide System Libraries选项。 例如,在我的屏幕上(如下所示),您将看到主机占用A代中分配内存的76.5%。钻取下来我可以发现,大部分的分配,45.2%,去UIImages。
有关仪器的更多详细信息和惊人的教程,请参阅: https : //www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started
希望这可以帮助! 😄
综上所述,“主”不能被点击的原因是因为select了“反向调用树”选项。 取消选中“反向呼叫树”可以解决问题。