泄漏的对象,我需要修复它
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,你可以释放。
alloc...
(任何以alloc
开头的方法),new
,copy...
,mutableCopy...
给你保留objects(感谢@jlehr 扩展了原始列表)。
- Collections保留
object 包含在其中(在您的情况下,
globals
保留
您创建的 NCObject
。
- 你应该平衡每一个保留
你用
release
或 autorelease
写 。如果你 release
一个 object,你就不能再使用它了,因为如果它
retainCount
已归零,将立即取消分配。一个
autoreleased object 将一直存在到最近的 autoreleasepool
排水管。
在您编写的示例中,您必须平衡一个 alloc
,因此您必须在将其添加到数组后 release
您的 NCObject
(如果你在那之前 release
它,它很可能会被释放),或者 autorelease
它随时你想要的。
但我真的建议您阅读 Apple 的 Advanced Memory Management Programming Guide。它很短。它描述了您需要的所有规则。
我正在将大约 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,你可以释放。
alloc...
(任何以alloc
开头的方法),new
,copy...
,mutableCopy...
给你保留objects(感谢@jlehr 扩展了原始列表)。- Collections保留
object 包含在其中(在您的情况下,
globals
保留 您创建的NCObject
。 - 你应该平衡每一个保留
你用
release
或autorelease
写 。如果你release
一个 object,你就不能再使用它了,因为如果它retainCount
已归零,将立即取消分配。一个 autoreleased object 将一直存在到最近的autoreleasepool
排水管。
在您编写的示例中,您必须平衡一个 alloc
,因此您必须在将其添加到数组后 release
您的 NCObject
(如果你在那之前 release
它,它很可能会被释放),或者 autorelease
它随时你想要的。
但我真的建议您阅读 Apple 的 Advanced Memory Management Programming Guide。它很短。它描述了您需要的所有规则。