在objective-c中捕获内存泄漏的设计模式?

在objective-c中捕获内存泄漏的设计模式?,objective-c,memory-management,memory-leaks,memory-leak-detector,Objective C,Memory Management,Memory Leaks,Memory Leak Detector,我已经阅读了苹果的《内存管理指南》,并且认为我理解了确保应用程序中正确内存管理应该遵循的实践 目前,我的代码中似乎没有内存泄漏。但随着我的代码变得越来越复杂,我想知道是否有任何特定的模式可以跟踪对象的分配和解除分配 在应用程序的整个执行过程中创建某种全局对象(包含某一类型的活动对象的数量计数)是否有意义?每个对象都可以在其init方法中增加其类型的计数,并在dealoc中减少该计数。全局对象可以在适当的时间验证特定类型的计数是否为零 编辑:我也知道如何使用泄漏,以及如何使用Xcode分析项目。这

我已经阅读了苹果的《内存管理指南》,并且认为我理解了确保应用程序中正确内存管理应该遵循的实践

目前,我的代码中似乎没有内存泄漏。但随着我的代码变得越来越复杂,我想知道是否有任何特定的模式可以跟踪对象的分配和解除分配

在应用程序的整个执行过程中创建某种全局对象(包含某一类型的活动对象的数量计数)是否有意义?每个对象都可以在其init方法中增加其类型的计数,并在dealoc中减少该计数。全局对象可以在适当的时间验证特定类型的计数是否为零

编辑:我也知道如何使用泄漏,以及如何使用Xcode分析项目。这篇文章的目的是跟踪那些可能无法通过泄漏检测到或很容易分析的案例


编辑:同样,有这样的东西似乎是有意义的,这样可以通过运行检查全局对象的单元测试在构建早期检测到泄漏。我想作为一个没有经验的objective-c程序员,我会从其他人的观点中获益。

不要走那条路。。。这是单一继承的痛苦。最重要的是,在您认为必须创建一些全局计数器之前,您应该掌握一些优秀的工具全局计数器已经存在于一些工具中——学习它们

你与之斗争的方式是学会如何在写作时正确地平衡和管理一切。事后看来,这真的很简单

ARC是另一种选择——实际上这只是推迟了你的理解

第一个“设计模式”我建议在可能的情况下使用
release
而不是
autorelease
(尽管通常对于过度发布更有用)

接下来,定期运行泄漏工具/util并立即修复所有泄漏/僵尸

第三,边走边学习现有的工具!这些工具可以做一些非常疯狂的事情,比如记录每个分配和每个引用计数的回溯。您可以暂停程序的执行并查看存在的分配、分配计数、回溯和各种其他统计信息

每个对象都可以在其init中增加其类型的计数 方法,并在dealoc中递减

要做到这一点,您必须执行以下操作之一:1)在某些公共点重写行为,例如NSObject的
-init
,或2)将适当的代码添加到每个类的指定初始值设定项中。两者似乎都不简单

全局对象可以在适当的时间验证 特定类型为非零

听起来不错,但你能详细说明一下“合适的时间”吗?在程序生命周期中的任何给定点,您如何知道哪些类应该没有实例?你会有一个很好的想法,在程序的末尾应该没有对象,但在这种情况下,仪器可以告诉你同样的事情


Objective-C采取了几个步骤来简化内存管理。尽可能使用属性和综合访问器,因为它们基本上是为您管理对象的。最近的一项改进是ARC,它更进一步自动化了大多数内存管理任务。基本上,您可以让编译器确定内存管理调用的放置位置——就像没有垃圾收集器的垃圾收集一样。在你尝试发明新的工具之前,先学会好好使用这些工具。

你能再多介绍一下全局计数器和你正在谈论的其他工具吗?(名称等?)谢谢。Instruments.app->Allocations和
heap
是我使用最多的计数器。我目前的项目是一个iPhone游戏,其中每个关卡都包含与之相关的所有对象。因此,当一个级别完成时,它的所有对象都应该被解除分配,这将是检查计数器的正确时间。我已经使用了合成属性和访问器。我无法将我的项目迁移到ARC,因为我使用了一些目前无法修改的第三方库。请记住,如果需要,您可以为单个文件禁用ARC。您可以使用
[anObject retainCount]
始终找到对象的保留计数,因此您的系统是不必要的。@gurooj如其本身所述,您不应该使用该方法调试内存管理(或其他任何内容)。