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

Uno*_*ome 1 debugging memory-leaks ios ipad-mini swift

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

以下是调试消息的示例.

2015-03-11 17:04:02.420 PROJECT_NAME[154:4100] Received memory warning.
Run Code Online (Sandbox Code Playgroud)

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

我一直在想的另一个选择是在控制器didRecieveMemoryWarning()函数中放置一个print语句.

什么是最好在Swift中跟踪和调试这些?

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

UPDATE

我也很想知道Swift内存泄漏的一些常见原因?在我的情况下,我使用UITableView导航控制器到另一个UITableView.第二个表视图包含一些主要使用文本和小图像的自定义单元格.我假设图像(虽然很小,主要用于审美目的)是什么导致了这个问题.我将使用旁边建议的仪器进行调试,以确切了解这是做什么的.

UPDATE

所以我一直在探测器中试图找到可能导致内存泄漏的东西,并且探测器中的所有东西似乎都是代码,这是库代码,但我做了一些筛选后发现了一些东西的引用.在我的代码中.人们一再重复如下.

在此输入图像描述

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

Rob*_*Rob 5

此时,如果要确定内存问题的根源,则需要更改齿轮.使用WWDC 2013视频修复内存问题或WWDC 2012 iOS应用程序性能:内存中所示的工具.使用"仪器"中的"分配"工具,您可以识别正在分配和未分发的内容.只有这样才能继续解决问题(例如,修复任何强大的参考周期等).在确定问题的根源之前,我们无法建议您如何解决问题,而仪器将帮助您解决问题.

虽然这些演示文稿用Objective-C说明了这种做法,但Swift中的原理是相同的,并且仪器中的Allocations和Leaks工具的使用是相同的.

  • 我不完全确定,但我认为这不重要。你真的不关心内存警告在哪里触发,因为它总是你的应用程序在过去遭受内存问题的结果。现在。上述视频包括用于跟踪此类问题的正确技术的演示。 (2认同)
  • `didReceiveMemoryWarning` 的目的是让你的应用程序有机会丢弃内存中的任何内容,否则它很容易重新创建。例如,出于性能原因,您可能会在滚动表格时缓存图像,但如果您收到内存警告,则需要清空缓存。并且,是的,它在每个视图控制器上调用 `didReceiveMemoryWarning`(以及发布任何对象可以观察的通知,如果它愿意的话)。这是一个生硬的工具:这个想法是“我们的记忆力是灾难性的,所以摆脱任何你不需要的东西。” (2认同)