2016-08-06 89 views
2

这是我第一次从我的iOS应用程序中修复内存问题,所以我不确定如何跟踪它,我一直在阅读来自不同博客的帖子,我发现我的记忆在不断增加:enter image description hereXcode修复内存问题

问题是我不知道如何跟踪和修复我的代码中的问题,并且我也不知道什么应该是最好的“增长”记忆。谢谢。

+0

尝试在你的应用程序运行泄漏仪器。如果你有什么是真正的内存泄漏,它应该找到它。有一些设计会导致你的内存占用量不断增加。例如,如果您不断调用segues来访问每个新的视图控制器而不关闭旧的视图控制器,随着视图控制器堆栈的增长和增长,您将永久增加内存占用。 –

回答

1

首先,我建议你看WWDC 2013 Fixing Memory Problems和WWDC 2012 iOS App Performance: Memory视频。它们是过时的,但仍然相关,展示了将上述屏幕快照下移到下一个级别,以确定内存问题的根本来源。

话虽如此,我有两点意见:

  • 以我的经验,如今,这个问题很少被“泄露记忆”(即内存已经分配,​​对其中有没有更多的参考资料,但你忽略了它)。在Swift中很难泄漏(如果你在Objective-C代码中使用静态分析器,那么它也是如此)。

    更常见的问题是由强引用周期导致的“废弃内存”,重复计时器未被取消,视图控制器场景之间的循环引用等。这些将不会被“泄漏”工具识别。只有通过挖掘分配工具。

  • 首先,我经常喜欢看看什么是废弃内存的大部分原因。所以,我双击一个顶级调用树,它会告诉我哪里有被遗弃的分配内存:

    enter image description here

    注意,这并没有告诉我为什么这个被废弃,但通过了解体块被遗弃的记忆被分配了,它给了我一些线索(在这个例子中,我开始怀疑SecondViewController)。

  • 然后我钻入世代结果,并开始在分配中查找我的类(也可以通过手动选择分配图的相关部分,如discussed here)执行此操作。然后我筛选结果,在这里搜索我的课程。当然,这不会永远是最显著的分配,但在我的经验,这种被遗弃的记忆几乎总是从我的课的一些滥用茎:

    enter image description here

    再次,这是指点我到SecondViewController类。

    注意,看着代的时候,我通常忽略第一一两代人,因为他们可能有误报从应用程序而产生“热身”。我专注于后几代(并确保我只在应用恢复到某种稳定,静止状态时“标记”一代。

  • 为了完成,值得指出的是有时候有用的运行仪器与“记录的引用计数”功能在未发行的分配:

    enter image description here

    如果你这样做,你有时可以钻入的保留和释放通话清单,并确定谁仍具有很强的借鉴意义(专注于未配对的保留/释放呼叫)在这种情况下,它不是非常有用,因为它太多了,但我提到因为有些输入法这是非常有用的诊断谁仍然具有较强的参考:

    enter image description here

  • 如果您使用Xcode中8,它通过这在很大程度上削减,图形表示的强引用了辉煌的对象图调试器有问题的对象,例如:

    enter image description here

    由此看来,问题跳出我,我不仅有导航控制器保持这种视图控制器的引用,但一个计时器。这恰好是一个重复的计时器,我忽略了它到invalidate。在这种情况下,这就是为什么这个对象没有被取消分配。

在没有Xcode中8的对象图形调试器,你留下来通过保留和释放引用浇筑(你可以看看每个那些强引用的,建立在那里,并确定他们是否被正确释放)或者只是通过我的代码来查看可能保留特定视图控制器的事情(强引用循环,重复计时器和循环视图控制器引用是我看到的最常见的问题)。

+0

我在跟踪内存问题时遇到了一个问题,在获得视图控制器名称的标记(例如您在屏幕截图中显示的标记)中,这意味着什么?我得到的主要是类名和其他类型的依赖关系,只是为了说明一点,我使用地图框,显然它在开发人员工具中不断出现。 – reojased

+0

寻找你的任何课程。如果你什么都看不到,也要考虑缓存。正如该视频所描述的,除了泄露的内存(无法再次访问)和废弃的内存(永远不会再次访问)之外,还有缓存的内存(不太可能在短时间内使用)。这就是为什么Allocations工具很有用,因为您可以识别_what_正在被分配,而不是被释放,并从那里驱动您的分析(并专注于那些20 + mb代)。因此,确保所有缓存都对内存压力做出响应,然后模拟内存警告并查看会发生什么情况。 – Rob

+0

好的,我会检查一下,还有一件事,第一代超过40MB是一个问题?或者它只是应用程序“热身”?@Rob – reojased

0

最小化您的应用程序的内存占用

对于稳定性和性能的优势,了解和倾听的内存量不同可用跨各种设备上的应用支持你的应用程序是非常重要的。最大限度地减少应用程序的内存使用量是确保其全速运行并避免因客户实例化中的内存耗尽而导致崩溃的最佳方法。此外,使用“分配工具”评估应用程序中的大内存分配有时可能是一个快速练习,可以产生令人惊讶的性能提升。

Apple Official Document