Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中调试内存警告?_Ios_Debugging_Swift_Memory Leaks_Ipad Mini - Fatal编程技术网

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

Ios 如何在Swift中调试内存警告?,ios,debugging,swift,memory-leaks,ipad-mini,Ios,Debugging,Swift,Memory Leaks,Ipad Mini,我有一个正在开发的应用程序,在iPad mini 1上长时间使用后肯定会出现一些内存问题。调试器将开始抛出内存警告,直到崩溃,我想知道代码中的哪个控制器导致了这个问题 下面是调试消息的示例 2015-03-11 17:04:02.420 PROJECT_NAME[154:4100] Received memory warning. 我得到的调试消息给出了一个时间戳和项目名称,括号中有一些信息。我如何使用它来查找导致此问题的控制器?括号信息似乎不是代码行号,因为它前面的名称是项目名称而不是文件名

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

下面是调试消息的示例

2015-03-11 17:04:02.420 PROJECT_NAME[154:4100] Received memory warning.
我得到的调试消息给出了一个时间戳和项目名称,括号中有一些信息。我如何使用它来查找导致此问题的控制器?括号信息似乎不是代码行号,因为它前面的名称是项目名称而不是文件名

我一直在考虑的另一种选择可能是在controllers
didReceiveMemoryWarning()
函数中放入一个print语句

在Swift中跟踪和调试这些问题的最佳方法是什么

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

更新

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

更新

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


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

此时,如果您想确定内存问题的根源,您需要改变档位。使用WWDC 2013视频或WWDC 2012中说明的仪器。使用工具中的分配工具,您可以确定正在分配和未发布的内容。只有这样,您才能继续解决问题(例如,修复任何强参考循环等)。在您确定问题的根源之前,我们无法建议您如何解决问题,仪器将帮助您做到这一点


虽然这些演示说明了Objective-C的实践,但Swift的原则是相同的,工具中分配和泄漏工具的使用也是相同的。

您可以使用工具工具分配档案器可以提供帮助。如果内存问题导致应用程序响应缓慢,那么时间分析器也可以。有很多完全不同的问题可能会导致内存问题。常见问题包括强引用周期、废弃内存和缓存使用率差。您应该(使用仪器)确定泄漏的内容,这将帮助您缩小候选问题的范围。@Rob,我在问题中添加了一些更详细的信息,包括我在探查器中找到的一些信息。太好了,您已经使用仪器确定泄漏的内容,现在的问题是为什么。我会检查查看这些按钮显示在其视图上的视图控制器是否已释放。如果不是,您可能有一个强引用循环(例如,重复
NSTimer
或引用self的某些块属性。因此,首先确认视图控制器本身是否泄漏,然后找出原因(从存在对它的强引用开始)。如果查看代码不明显,Instruments具有跟踪保留计数的功能,您可以使用该功能来确定强引用的位置。我将检查这些内容,并根据情况更新帖子或接受。+1问题,[NUMBER:NUMBER]是什么调试器打印出来的意思是?我不完全确定,但我认为这无关紧要。你真的不在乎内存警告是在哪里触发的,因为它总是由你的应用程序在过去遇到的内存问题造成的。这就是为什么你使用类似于仪器的东西,因为它跟踪历史分配,n现在正在发生的事情。前面提到的视频演示了跟踪这类问题的正确技术。我明天将在工作中介绍这些技术。didReceiveMemory警告功能的意义是什么?我假设当它检测到问题时,它会调用所述方法的内容,您可以执行一些例行操作EAN旨在减少一些内存使用,但如果它只发生在过去的问题上,这是否意味着它会从每个控制器调用每个DIRECEIVEMEMORY函数,因为从技术上讲,它不知道是什么导致了问题?DIRECEIVEMEMORY WARNING的要点是让你的应用程序有机会丢弃内存中可能存在的任何东西轻松重新创建。例如,出于性能原因,您可能会在滚动表格时缓存图像,但如果收到内存警告,您会清空缓存。是的,它会在每个视图控制器上调用
didReceiveMemoryWarning
(以及发布任何对象都可以观察到的通知,如果它愿意的话).这是一个直截了当的工具:这个想法是“我们的记忆严重不足,所以扔掉你不需要的东西。”