Objective C / iPhone:需要“最佳实践”来调试内存管理错误

时间:2010-01-13 00:01:20

标签: iphone objective-c debugging memory-management

所以...我写了我的第一部iPhone游戏,其中包括50个谜题。

在每个难题的开头,我创建了一些字符串,各种可变指针数组,其中一些指向运行时创建的子视图。所有保留变量都声明为各种类属性。然后在拼图的最后我删除子视图,释放任何分配指针的内存,没有我的指针。然后再次为下一个谜题创建它们。

该应用程序运行良好的前2,3,有时4个谜题然后崩溃与看似随机的坏访问错误等我正在努力追查。显然我对iPhone内存管理不太满意:)

那么,我需要调试建议吗?您是否阅读了每行代码并记下每个分配,每个子视图和一种手动保留计数?我是否搜索alloc并将它们与发布相匹配?还是有其他技术吗?

我不希望回复只要我的问题,但是会有任何提示和技巧!谢谢!

3 个答案:

答案 0 :(得分:4)

正如其他人所说,静态分析仪有很多帮助 - 在Snow Leopard中你可以运行“构建和分析”并阅读结果。

我会说下一步将是乐器,但似乎更像是你的问题是早期释放对象而不是泄漏内存。要追踪到这一点,最好的办法是启用僵尸检测。

在XCode中,打开项目浏览器中的“可执行文件”项,右键单击可执行文件并选择“获取信息”。然后转到“Arguments”选项卡,转到下半部分并添加一个新的环境变量。将其命名为“NSZombieEnabled”并将值设置为“YES” - 确保它也被检查,但如果您正在创建它,则默认情况下应该是。

现在,当您运行的应用程序,只要您使用的是已被释放的对象调试器将只是你得到BAD_ACCESS消息之前停止,你可以看到被释放应该不会。

完成后,您要取消选中可执行文件的NSZombieEnabled变量,因为系统在设置时不会释放任何内存。

调试这些东西可能有点棘手,因为你必须找出释放对象的所有地方,以便找到它最终被错误释放的位置。 Snow Leopard Instruments对此有所帮助,因为Object Alloc与NSZombieEnabled一起工作,向您展示了所有对象被释放的轨迹。

您还可以使用“泄漏”工具查找您认为已释放物品的地方,但实际上并没有 - 尽管我在实践中发现大约一半的时间泄漏不会显示任何东西,因为除了泄漏,你保持对周围物体的参考,所以泄漏不知道你真的有泄漏。仅仅观看Object Alloc图表并选择在您认为不应该释放内存时攀爬的区域是一个非常好的主意。

答案 1 :(得分:3)

您是否在代码上运行静态分析器?这应该抓住大部分这些错误。在项目的Xcode构建选项中,启用RUN_CLANG_STATIC_ANALYZER。

答案 2 :(得分:0)

静态分析仪在拾取保留泄漏方面做得非常好。我倾向于使用 Apple Key A来构建,它会自动将分析作为构建的一部分。

下一步是查看 Instruments 。我建议您在 Instruments 中运行您的应用,作为预提交流程的一部分。您可以在应用程序运行时跟踪分配,检查泄漏,性能测试等。

相关问题