如何使用分配工具管理应用程序的内存配置文件

在Slash Keyboard工作期间,内存使用一直是我们必须密切注意的事情。 通常,您的应用程序的内存配置文件是无关紧要的,因为iOS在为您管理内存方面做得很好。 但这一切都在键盘扩展中发生了变化。

键盘扩展程序基本上是作为一个应用程序运行在另一个应用程序之上的,它不会分配给它自己的内存。 相反,它与您使用的应用程序共享相同的内存池。 如果内存过紧,操作系统将优先于键盘优先应用程序。 在这种情况下,系统内存有限时,键盘的性能可能会受到影响。 幸运的是,Apple提供了一个名为Allocations的漂亮工具来帮助检测内存泄漏。 在本文中,我将介绍如何使用此工具来跟踪应用程序中的内存泄漏。

iOS中的内存使用情况

分配是Apple提供给开发人员的绝佳工具,它可以检测开发人员的代码何时导致分配内存。 在介绍如何使用此工具之前,我想先介绍一些有关为什么您可能会遇到内存问题的理论。

iOS使用所谓的自动引用计数(ARC)。 ARC将为新的类实例分配一块内存,并在不再使用该类时适当地重新分配该内存。 在Apple的开发人员文档中:

在Swift中,“内存管理“就可以正常工作”,您无需自己考虑内存管理。 当不再需要类实例使用的实例时,ARC会自动释放它们。

听起来不错吧? 在大多数情况下,是的。 但是在某些情况下,可能会导致ARC无法自动取消分配内存。 在给定的类上创建强引用循环时,会发生这种情况。 通过将一类中的变量分配给另一类中没有前缀“弱”或“无主”的变量来创建强引用。 创建后,ARC将不会释放具有强引用的任何类。 随着时间的流逝,这将导致您的内存使用量随着应用程序的使用和类的创建而增加,并且在需要时不会删除。

为了解决这个问题,我们为每个var加上“弱”或“无主”前缀,这可能会导致强大的参考周期。 这向ARC发出信号,当需要取消分配该类时,这些变量不应持有强引用。 现在,您可能不想使所有引用变得虚弱或无主,但是可能需要修复强大的引用周期。 要确定您是否有问题,请使用Xcode中的“分配工具”。

分配工具

可以在Xcode的顶部菜单中访问“分配”工具,然后选择“工具”。 或者,您可以使用热键Command + I访问运行的仪器。 注意:我更喜欢在设备上运行分配,而不是使用模拟器。 我觉得使用设备可以获得更好的效果。

进入乐器后,选择分配工具。 这是带有橙色框的那个。 如您所见,Apple提供了许多其他工具,所有这些工具本身都非常有用。

使用窗口右上角的“记录”按钮运行应用程序(同样最好在设备上)后,您正在跟踪应用程序的内存配置文件。 您应该做的第一件事是将右列设置为“ E”图标。 这将使您可以查看要签出的进程的堆栈跟踪。 在中间,我们看到一堆已经分配了内存的进程,并按分配的字节数降序排列。 忽略前三个灰色进程。

让我们检查列表中的第一个过程。 一旦我单击了流程名称旁边的小箭头(是的,它很小得令人难以置信,如果您不注意的话,很容易错过它),您将被发送到其子流程的更详细视图。 在这里,我们可以看到分配内存的各个进程。 如果在“ E”上设置了正确的窗格,则可以看到此过程的堆栈跟踪,并可以查看编译器执行哪些步骤来分配内存。 黑色的任何进程都是用户生成的,灰色的任何进程都是您无法控制的系统进程。 在此特定过程中,我的UI在主线程上进行了更新,可以占用内存。 如果我双击有问题的进程,将出现一个弹出窗口,向我显示导致内存使用的确切代码行。 重复此过程,直到您的应用程序的内存配置文件在合理范围内为止,这取决于您所创建的应用程序的类型。

尽管您可能不需要像键盘扩展那样担心内存管理,但是管理内存配置文件和提高应用程序内存的使用效率可以提高性能。 考虑到弹出打开的Allocations并快速审核您的应用有多么容易,这是一个明智的选择。 希望分配像我一样成为您的开发人员工具包的一部分。