//creates memory leak
self.editMyObject = [[MyObject alloc] init];
//does not create memory leak
MyObject *temp = [[MyObject alloc] init];
self.editMyObject = temp;
[temp release];
第一行代码会造成内存泄漏,即使您在类的 dealloc 方法中执行 [self.editMyObject release]。 self.editMyObject 是 MyObject 类型。第二行不会导致内存泄漏。第一行是不正确的还是有释放内存的方法?
最佳答案
正确的行为取决于 editMyObject @property 的声明。假设它被定义为
@property (retain) id editMyObject; //id may be replaced by a more specific type
或
@property (copy) id editMyObject;
然后通过 self.editMyObject =
分配保留或复制分配的对象。由于 [[MyObject alloc] init]
返回一个保留对象,您作为调用者拥有该对象,因此您拥有 MyObject 实例的额外保留,因此除非有匹配的释放(如在第二 block )。我建议您阅读 Memory Management Programming Guide [2].
您的第二个代码块是正确的,假设该属性已按上述方式声明。
附注您不应在 -dealloc
方法中使用 [self.editMyObject release]
。您应该调用 [editMyObject release]
(假设支持 @property 的 ivar 称为 editMyObject
)。调用访问器(通过 self.editMyObject
对于 @synthesized 访问器是安全的,但是如果覆盖访问器依赖于对象状态(这在 -dealloc
中的调用位置可能无效) > 或导致其他副作用,调用访问器会出现错误。
[2] Cocoa 中的对象所有权规则非常简单:如果你调用一个在其签名中有 alloc
或 copy
的方法(或使用 + [NSObject new]
基本上等同于 [[NSObject alloc] init]
),那么你“拥有”返回的对象,你必须通过 发布
。在所有其他情况下,您不拥有从方法返回的对象。如果您想保留它,您必须使用 retain
获取所有权,然后使用 release
释放所有权。
关于objective-c - 为什么这会造成内存泄漏(iPhone)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/612986/