泄漏的对象,我需要修复它

Leaking objects, and I need to fix it

我正在将大约 2006 年的一些较旧的 ObjC 代码导入到最新的 Xcode。是在ARC时代之前写的,我对之前的系统没有很强的把握。正在寻找有关如何诊断这些问题的一些建议。

这是一个例子,数百个中的一个...

sym = [ globals addObject:[ [ NCObject alloc ] initWithArray:saved dimension:dimension type:type ] ] ;

错误不具体,我需要围绕整个事情进行自动释放,还是在 "type ]" 之后立即进行自动释放?

我似乎记得基本规则是,如果我看到一个 inti,我需要自动释放它。我还需要考虑其他情况吗?

是的。自动释放是对的。 alloc 创建一个 rc=+1 对象。将它添加到数组中使其 +2。 Autorelease 会将其保留在 +1,这是您想要的位置。释放 globals 数组最终会将其恢复为 0,这也是期望的行为。

为清楚起见:

sym = [[NCObject alloc] initWithArray:saved dimension:dimension type:type];
[globals addObject:sym];
[sym autorelease];

请注意 release 在这种情况下同样好(更好一点,因为它不会为以后留下任何自动释放池工作)。除非函数returns sym,你可以释放。

  1. alloc...(任何以alloc开头的方法),newcopy...mutableCopy...给你保留objects(感谢@jlehr 扩展了原始列表)。
  2. Collections保留 object 包含在其中(在您的情况下,globals 保留 您创建的 NCObject
  3. 你应该平衡每一个保留 你用 releaseautorelease。如果你 release 一个 object,你就不能再使用它了,因为如果它 retainCount 已归零,将立即取消分配。一个 autoreleased object 将一直存在到最近的 autoreleasepool 排水管。

在您编写的示例中,您必须平衡一个 alloc,因此您必须在将其添加到数组后 release 您的 NCObject (如果你在那之前 release 它,它很可能会被释放),或者 autorelease 它随时你想要的。

但我真的建议您阅读 Apple 的 Advanced Memory Management Programming Guide。它很短。它描述了您需要的所有规则。