Xcode 的调试导航器没用吗?
Is Xcode's debug navigator useless?
我正在 Xcode 中构建一个应用程序,现在正在深入研究项目的内存管理部分。当我使用 Allocations and Leaks 时,我得到的结果似乎与我在 Xcode 的调试面板中看到的结果完全不同:特别是调试面板似乎显示出比我在 Allocations 中看到的要高得多的内存使用情况,而且它似乎也突出显示据我所知 (1) 不存在且 (2) 已被 Leaks 工具确认不存在的泄漏。这个东西是不是没用,甚至更糟,误导?
这是一个新的:今天它告诉我我正在使用 >1 GB 的内存,但它的小内存表读数显着 <1 GB(如果分配数据准确,仍然是错误的)。下图。
更新:我在 38 分钟的会话中 运行 VM Tracker,它确实显示虚拟内存占分配/泄漏和内存量表之间的差异。下图。我还不完全确定如何考虑这个问题。我们的游戏使用了大量交换的纹理。我想这在我们这种规模的大多数游戏中都很常见(11 个棋盘,330 个关卡;每个棋盘和地图屏幕都有独特的艺术作品)。
您可能在使用调试构建配置在模拟器中 运行 时使用内存量规。这两者都会给您带来误导性的记忆结果。了解内存管理方式的唯一可靠方法是 运行 在使用 Release 版本的设备上。 Instruments 使用 Release 构建配置,因此它已经比 运行ning 和使用 Memory Gauge 更好。
此外,Xcode 内置内存工具(例如内存调试器)可能会针对泄漏生成误报,这是一个已知缺陷。
然而,Instruments 也有其缺陷。我的经验是,例如,它无法捕获应用程序启动期间产生的泄漏。另一个问题是人们并不总是理解如何阅读它的输出。比如你说:
the debug panel seems to show much higher memory usage than what I see in Allocations
是的,但分配并不是全部。您可能没有查看 VM 分配。这些单独显示并且通常构成高内存使用的原因(因为它们包括图像的后备存储和视图渲染树)。 Memory Gauge 确实包括虚拟内存,因此仅此一项就可以解释您认为您看到的 "difference"。
因此,您的问题的答案是:不,内存量表并非毫无用处。它可以很好地告诉您何时可能需要对内存问题保持警惕。但是您需要切换到 Instruments 进行适当的分析。
我正在 Xcode 中构建一个应用程序,现在正在深入研究项目的内存管理部分。当我使用 Allocations and Leaks 时,我得到的结果似乎与我在 Xcode 的调试面板中看到的结果完全不同:特别是调试面板似乎显示出比我在 Allocations 中看到的要高得多的内存使用情况,而且它似乎也突出显示据我所知 (1) 不存在且 (2) 已被 Leaks 工具确认不存在的泄漏。这个东西是不是没用,甚至更糟,误导?
这是一个新的:今天它告诉我我正在使用 >1 GB 的内存,但它的小内存表读数显着 <1 GB(如果分配数据准确,仍然是错误的)。下图。
更新:我在 38 分钟的会话中 运行 VM Tracker,它确实显示虚拟内存占分配/泄漏和内存量表之间的差异。下图。我还不完全确定如何考虑这个问题。我们的游戏使用了大量交换的纹理。我想这在我们这种规模的大多数游戏中都很常见(11 个棋盘,330 个关卡;每个棋盘和地图屏幕都有独特的艺术作品)。
您可能在使用调试构建配置在模拟器中 运行 时使用内存量规。这两者都会给您带来误导性的记忆结果。了解内存管理方式的唯一可靠方法是 运行 在使用 Release 版本的设备上。 Instruments 使用 Release 构建配置,因此它已经比 运行ning 和使用 Memory Gauge 更好。
此外,Xcode 内置内存工具(例如内存调试器)可能会针对泄漏生成误报,这是一个已知缺陷。
然而,Instruments 也有其缺陷。我的经验是,例如,它无法捕获应用程序启动期间产生的泄漏。另一个问题是人们并不总是理解如何阅读它的输出。比如你说:
the debug panel seems to show much higher memory usage than what I see in Allocations
是的,但分配并不是全部。您可能没有查看 VM 分配。这些单独显示并且通常构成高内存使用的原因(因为它们包括图像的后备存储和视图渲染树)。 Memory Gauge 确实包括虚拟内存,因此仅此一项就可以解释您认为您看到的 "difference"。
因此,您的问题的答案是:不,内存量表并非毫无用处。它可以很好地告诉您何时可能需要对内存问题保持警惕。但是您需要切换到 Instruments 进行适当的分析。