避免,发现和消除Cocoa中的内存泄漏

sch*_*hwa 19 memory debugging macos cocoa objective-c

内存(和资源)泄漏发生.你怎么确定他们没有?

您会建议哪些提示和技巧可以帮助避免首先造成内存泄漏?

一旦您的应用程序泄漏,您如何追踪泄漏源?

(哦,请避免"只使用GC"答案.在iPhone支持GC之前,这不是一个有效的答案,即便如此 - 可能会泄漏GC上的资源和内存)

mma*_*alc 21

在XCode 4.5中,使用内置的静态分析器.

在3.3之前的XCode版本中,您可能必须下载静态分析器.这些链接向您展示如何:

使用LLVM/Clang静态分析器

为了避免首先造成内存泄漏,请使用Clang Static Analyzer - 毫不奇怪 - 在Mac OS X 10.5上分析您的C和Objective-C代码(还没有C++).安装和使用它是微不足道的:

  1. 从此页面下载最新版本.
  2. 从命令行cd到项目目录.
  3. 执行scan-build -k -V xcodebuild.

(还有一些额外的约束等,特别是你应该在其"调试"配置中分析一个项目 - 请参阅http://clang.llvm.org/StaticAnalysisUsage.html了解详细信息 - 但这或多或少归结为什么.)

然后,分析器会为您生成一组网页,显示可能的内存管理以及编译器无法检测到的其他基本问题.

如果您的项目不针对Mac OS X桌面,则还有其他一些细节:

  1. 将所有配置的Base SDK设置为使用Mac OS X桌面框架的SDK ...
  2. 将命令行构建设置为使用调试配置.

(这与这个问题大致相同.)


mma*_*alc 16

不要过度思考内存管理

出于某种原因,许多开发人员(尤其是早期开发人员)使得内存管理对于他们自己来说比以往任何时候都更加困难,通常是通过过度思考问题或者想象它比它更复杂.

基本规则是非常简单的.你应该专注于那些.不要担心其他对象可能会做什么,或者对象的保留计数是什么.相信其他人都遵守相同的合同,并且所有人都会工作.

特别是,我要重申一点,就是不要担心对象的保留计数.由于各种原因,保留计数本身可能会产生误导.如果您发现自己记录了对象的保留计数,那么您几乎肯定会走错路.退后一步问问自己,你是否遵循了基本规则?


mma*_*alc 10

始终使用访问方法; 使用属性声明访问器

如果您始终使用访问器方法将值分配给实例变量(除了init*dealloc方法),您可以让自己的生活更加简单.除了确保正确触发任何副作用(例如KVO更改通知)之外,与使用retains和s 洒你的代码相比,它使得复制粘贴或其他逻辑错误的可能性大大降低.release秒.

声明访问器时,应始终使用Objective-C 2属性功能.属性声明使访问器的内存管理语义显式化.它们还为您提供了一种简单的方法来与您的dealloc方法进行交叉检查,以确保您已经释放了您声明为retain或的所有属性copy.


sch*_*hwa 8

Instruments Leaks工具非常适合发现某类内存泄漏.只需使用"使用Performance Tool启动"/"Leaks"菜单项即可通过此工具自动运行您的应用程序.适用于Mac OS X和iPhone(模拟器或设备).

Leaks工具可以帮助您找到泄漏源,但无法帮助您查找泄漏内存的保留位置.


mil*_*omi 6

  • 遵循保留和释放的规则(或使用垃圾收集).他们在这里总结.

  • 使用仪器追踪泄漏.您可以使用Xcode中的Build> Start With Performance Tool在Instruments下运行应用程序.