首页 > 解决方案 > Xcode的调试导航器没用吗?

问题描述

我正在 Xcode 中构建一个应用程序,现在深入到项目的内存管理部分。当我使用分配和泄漏时,我似乎得到了与我在 Xcode 的调试面板中看到的完全不同的结果:特别是调试面板显示的内存使用率似乎比我在分配中看到的高得多,而且它似乎也突出了泄漏我可以告诉(1)不存在,(2)被泄漏工具确认不存在。这东西是无用的,或者更糟的是,误导吗?

这是一个新的:今天它告诉我我正在使用 >1 GB 的内存,但它的小内存计读数明显小于 1 GB(如果分配数据准确,它仍然是错误的)。下图。

在此处输入图像描述

更新:我在 38 分钟的会话中运行了 VM Tracker,它确实显示虚拟内存占分配/泄漏和内存计量器之间的差异。下图。我还不完全确定如何考虑这个问题。我们的游戏使用了大量交换的纹理。我想这在我们这种规模的大多数游戏中很常见(11 个棋盘,330 个关卡;每个棋盘和地图屏幕都有独特的艺术作品)。

在此处输入图像描述

标签: xcodedebuggingmemory-managementmemory-leaksallocation

解决方案


您可能在使用 Debug 构建配置在模拟器中运行时使用 Memory Gauge。这两者都会给你误导性的记忆结果。了解内存管理方式的唯一可靠方法是在使用 Release 构建的设备上运行。Instruments 使用 Release 构建配置,因此它已经比仅运行和使用 Memory Gauge 更好。

此外,Xcode 内置内存工具(例如 Memory Debugger)可能会为泄漏生成误报,这是一个已知的缺陷。

然而,Instruments 也有其缺陷。我的经验是,例如,它无法捕获应用程序启动期间产生的泄漏。另一个问题是人们并不总是了解如何阅读其输出。例如,你说:

调试面板似乎显示的内存使用量比我在分配中看到的要高得多

是的,但分配并不是全部。您可能没有查看 VM 分配。这些是单独显示的,通常构成高内存使用的原因(因为它们包括图像的后备存储和视图渲染树)。Memory Gauge 确实包括虚拟内存,因此仅此一项就可以解释您认为您看到的“差异”。

所以,你的问题的答案是:不,内存计不是没用的。它很好地说明了您何时可能需要对内存问题保持警惕。但是您随后需要切换到 Instruments 进行适当的分析。


推荐阅读