如何调试 Swift 中的内存警告?

how to debug memory warnings in Swift?

我有一个正在开发的应用程序,在 iPad mini 1 上长期使用后肯定有一些内存问题。调试器将开始吐出内存警告,直到它崩溃,我想知道我们代码中的哪个控制器导致了这个问题。

这是调试消息的示例。

2015-03-11 17:04:02.420 PROJECT_NAME[154:4100] Received memory warning.

我收到的调试消息给出了时间戳和项目名称,括号中包含一些信息。我如何使用它来查找导致此问题的控制器?括号信息似乎不是代码行号,因为它前面的名称是项目名称而不是文件名。

我一直在考虑的另一种选择可能是在控制器 didRecieveMemoryWarning() 函数中放置一个打印语句。

在 Swift 中跟踪和调试这些内容的最佳方法是什么?

如果我需要提供更多信息,请告诉我。

更新

我也很想知道 Swift 中内存泄漏的一些常见原因?在我的例子中,我使用的是通过导航控制器导航到另一个 UITableView 的 UITableView。第二个 table 视图包含一些主要使用文本和小图像的自定义单元格。我假设图像(虽然很小并且主要用于美学目的)是导致问题的原因。我将按照旁边的建议使用仪器来调试它,以找出到底是什么在做这个。

更新

所以我一直在探查器中尝试寻找可能导致内存泄漏的东西,探查器中分配的东西似乎是库代码的代码,但经过一些筛选后我找到了一些引用我的代码中的内容。一个始终重复如下。

此代码位于自定义 UITableViewCell 从 Nib 唤醒方法中,并且与设置图像的初始状态有关,该状态将根据属于该单元格的数据状态而改变。我猜测这种动态图像加载可能会导致这些问题之一。问题是,我该怎么做才能解决它?

此时,如果您想确定内存问题的根源,则需要换档。按照 WWDC 2013 视频 Fixing Memory Issues or WWDC 2012 iOS App Performance: Memory 中的说明使用 Instruments。使用 Instruments 中的分配工具,您可以识别正在分配和未释放的内容。只有这样你才能继续解决问题(例如修复任何强引用循环等)。在您确定问题的根源之前,我们无法建议您如何解决问题,Instruments 将帮助您做到这一点。

虽然这些演示文稿说明了 Objective-C 的做法,但 Swift 中的原理是相同的,Instruments 中分配和泄漏工具的使用也是相同的。