使用仪器查找内存泄漏

我曾尝试阅读互联网上几乎所有体面的教程,但仍然无法理解这里发生了什么: 在此处输入图像描述

我“隐藏系统库”和“反转调用树”,但我不明白如何找到负责例如此泄漏的实际代码。 任何提示都表示赞赏。 可能是我遗漏了一些明显的东西。 我收到了数以百计的泄漏,但是我在封闭中使用weak ,我没有引用彼此的类等等。但看起来我错过了一些基本的东西。

截图中显示的问题是Instruments无法找到应用程序的调试符号。 仪器显示内存地址而不是函数名称。 即使您反转调用树并隐藏系统库,也无法在没有函数名称的仪器中找到内存泄漏源。

确保您的项目正在生成调试符号。 检查Generate Debug Symbols build设置是否设置为Yes。 如果您的项目正在生成调试符号,则Instruments可能无法找到包含调试符号的dSYM文件。 在仪器中选择仪器>调用树>定位dSYM。 dSYM通常与发行版本的应用程序包位于同一目录中。 以下文章提供了其他信息:

仪器:找到dSYM文件

内存泄漏可能很难追查。 这可能是一个耗时的过程,所以要做好准备。 最后,调试内存泄漏通常会有很多反复试验。 “Memory Leaks”仪器实际上过去只检测过一次泄漏。 我总是不得不使用“Allocations”仪器自己跟踪它们。

过去帮助我的一件事就是从试图找出实际泄漏的对象开始。 单击分配工具(“泄漏检查”上方的行)。 现在尝试按释放的对象数量或使用的内存量进行排序。 查看是否有任何对象在不应该粘贴时释放的数量为0。 查看是否存在占用exception内存量的对象类型。

内存泄漏总是由于开发人员在内存管理方面的错误。 Foundation和UIKit中的某些低级私有API中存在一些次要的内存泄漏。 在较低级别,他们正在处理更多的手动内存管理,因此更容易犯小错误。 你无法对这些做任何事情,但它们相对较少。

如果您的应用程序运行正常,您可能不需要担心修复它们。 您需要在此处进行一些成本效益分析。 如果这不会影响性能或稳定性,现在修复这些产品的时间是否值得为您和您的用户提供的微小优势?

但是,内存泄漏可能会增加是没有价值的,因此如果用户长时间打开您的应用程序,如果您随着时间的推移继续泄漏更多对象,泄漏的内存量最终将成为问题。 在某些时候,应用程序将崩溃,用户将不得不重新打开。 但是,如果你的内存泄漏足够小,除非应用程序已经开放HOURS,否则这不会成为一个问题,这真的是一个问题吗? 这一直是你的判断。