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

标签 ios swift instruments

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

  1. 使用分配工具运行应用程序。
  2. 应用启动后,我会等待 10 秒并点击“标记世代”
  3. 我打开怀疑存在内存泄漏的屏幕,等待 10 秒,关闭它,再等待一段时间,然后点击“标记世代”

此时,我查看第二代以查看从未释放的对象。我的麻烦是最大的罪犯总是只是“main”,它不指向任何特定的类或方法 enter image description here

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

我不确定这是否相关,但是当我转到"file"->“符号”时,我显示了一个缺失的符号,如下所示。但是,我在计算机上的任何位置都找不到此符号: enter image description here

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

最佳答案

有几点需要考虑。

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

example

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

2:如果您仍然想使用 Generations 来找出占用所有内存的内容,您可以取消选中“反转调用树”和“隐藏系统库”选项。例如,在我的屏幕上(如下所示),您将看到 main 占用了 A 代中已分配内存的 76.5%。深入研究后,我可以发现大部分分配(45.2%)都分配给了 UIImages。

example

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

希望这有帮助! 😄

关于ios - Swift 中的分配工具工具未提供足够详细的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37868685/

相关文章:

ios - 为什么 performSelector 在 swift 中不存在

ios - SKSpriteNode 框架偏离

ios - 将 subview 定位在圆形 View 的边缘

objective-c - 如何修复内存泄漏?

ios - 可定制的表格 View 单元格滑动以停止完全展开?

ios - 如何找到此系统警报的 UI View ?

ios - Xcode 工具是否支持 iOS 6.1.2 升级?

android - 广播接收器作为允许其他人的应用程序和服务向我的应用程序发送数据的方式

ios - 如何在其他类的 ViewDidAppear 和 ViewDidDisappear 中插入代码

swift - 无法使用 Swift 3 将类型 '(_, _) -> ()' 的值转换为预期的参数类型 'UserProfile.Completion'