Xcode / Swift-无法解决乐器的内存问题

时间:2019-05-10 03:35:46

标签: ios xcode instruments

我的应用程序存在内存问题,在某个阈值之后,该应用程序将崩溃。

已指示我使用仪器并选择Allocation选项。

但是,我似乎永远无法得到我问题的“直接”答案,我在下面附上了屏幕截图以帮助更好地描述问题。

Memory allocation depicted with Instrument

The root of the issue

内存问题未链接到我创建的任何ViewControllers或文件。而是使用了我不知道的其他库/框架。我已经与这个问题进行了几周的交涉,我更改了我的代码/实现了我认为可能已经解决了该问题的各种方法。但是,没有运气。

有人可以告诉我如何解决这个问题吗?由于我似乎无法强制释放内存,这反过来又意味着我的应用程序中存在这个巨大的内存错误。

谢谢。

编辑-添加了以全分辨率查看图像并返回主屏幕时的内存使用情况的屏幕截图。

Screenshot of memory usage when going back and forth between views

3 个答案:

答案 0 :(得分:0)

Instrument仅向您显示应用程序如何处理内存/ CPU等的概述。当您在仪器中找到某些东西时,必须对代码进行更改。

请参阅:For that you should understand how stong and weak works in iOS.

一旦您了解了iOS中的ARC。您将了解代码中的内存泄漏。

把戏是

  1. 尝试检查未从仪器内存中删除的对象数量。
  2. 然后检查代码以获取对象的强引用,并尝试删除不必要的<form method="post" id="typea" enctype="multipart/form-data"> <input type="text" name="People[0].Name" class="form-control" /> <input type="text" name="People[0].LastName" class="form-control" /> <input type="file" asp-for="FileLists" class="form-control" /> <input type="text" name="People[1].Name" class="form-control" /> <input type="text" name="People[1].LastName" class="form-control" /> <input type="file" asp-for="FileLists" class="form-control" /> <button class="btn btn-success" type="submit">Submit</button> </form> 引用。

希望这会对您有所帮助。

答案 1 :(得分:0)

一些想法:

  1. 请参阅this answer,其中讨论了如何使用WWDC 2016视频Visual Debugging with Xcode中附带的“调试内存图”工具。与工具相比,该工具通常更容易发现问题。它按目标/框架组织参考计数类型,从而更容易筛选结果。

    但是,如果您要处理非引用计数的malloc数据,那么使用Instruments是必经之路,因为它涉及所有复杂性。但是“调试内存图”通常是更好的第一道防线。

  2. 您说的是

      

    内存问题未链接到我创建的任何ViewController或文件。

    绝对要确保您的课程没有被埋在列表下方。数量将大大减少,尺寸也会更小,因此它们不会出现在顶部,即使它们可能是问题的根源,也将被埋在列表中。坦白地说,如果您的应用正在运行,则某些类必须放在某个地方。大声笑。

    同样,“调试内存图”方法比“仪器”更容易识别您自己的对象。

  3. 如果可能,我建议运行该应用程序,返回到您希望已发布内容的主屏幕,然后重复该过程几次。第一次返回静态状态的过程并不太有启发性,因为将会进行很多内部缓存。但是,随后您执行该应用程序并返回到主屏幕时,您将得到一个更好的示例,该示例说明了分配和不发布的内容,而没有操作系统在第一次迭代中所做的所有这些杂项:

    enter image description here

    (摘自WWDC 2013 Fixing Memory Issues。)

    希望“热身”记忆并不那么戏剧性,但是红色区域是我们经常关注的区域,因为这是我们继续使用该应用程序时“浪费”的东西(最终导致崩溃)。 / p>

    不幸的是,您的分配曲线根本没有显示出下降,这令人担忧。现在,也许您没有可以返回的“主屏幕”,所以也许这无关紧要。但是即使在这种情况下,您的应用程序中也应该有一些状态,可以看到内存正在恢复。根据提供的信息很难说。

  4. 您没有提到它,但请确认您拥有哪些调试选项。例如,如果您打开了僵尸,则可能不会看到内存回落到应有的程度。通常,当我们第一次遇到这类问题时,我们会开始使用所有这些调试选项,但是它们会影响应用程序的内存配置文件。因此,如果您一直在打开诸如僵尸之类的东西或拥有什么东西,则可能需要确保将其关闭,以确保它们不属于您所看到的行为。

  5. 我建议模拟内存警告,看看是否可以看到内存已恢复。确保您的代码正在观察并响应内存警告,并在可能的情况下清除内存。

  6. 这是所有常规建议,我们无法提供具体建议,除非您看到您的代码在做什么。我建议您创建项目的副本,删节无关的内容,并继续这样做,直到您获得这种无限增长的内存的最小的可复制示例。通常,该过程足以让您自己诊断问题。但是我们无法浏览大量代码。我们需要minimal, complete, and verifiable example的问题。

最底线,“调试内存图”通常是我们的第一层次分析。运行该应用程序,确定您希望释放哪些对象而不是哪些对象,然后从那里开始。另外,还要留意其中有多少这些对象(例如,如果您多次看到同一个视图控制器,则表明存在强大的参考周期或对视图控制器进行了循环调用)。

答案 2 :(得分:0)

我解决了我遇到的问题。以防万一将来有人遇到相同的问题,这就是我所做的:

  1. 如果我的出口/代表声明为weak
  2. 在XCode要求我使用self的代码块中使用关键字self的地方,我都会添加[weak self] in[unowned self] in
  3. 删除所有不需要的单词self的实例
  4. 添加了deinit并包含打印声明
  5. 添加了一个断点,其中调用了deinit方法
  6. 在我的viewDidLoad方法中对函数进行了注释,并逐一检查了导致问题的一个或多个。