//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实例的额外保留,因此除非存在匹配的发行版(如第二个块中所示),否则它将泄漏。我建议您阅读Memory Management Programming Guide [2]。假设已如上所述声明属性,则您的第二个代码块是正确的。
p.s.您不应该在
[self.editMyObject release]
方法中使用-dealloc
。您应该调用[editMyObject release]
(假设支持@property的ivar被称为editMyObject
)。调用访问器(通过self.editMyObject
对于@synthesized访问器是安全的,但是如果重写的访问器依赖于对象状态(在-dealloc
的调用位置可能无效,或者导致其他副作用,则通过调用访问器会出现错误)。[2] Cocoa中的对象所有权规则非常简单:如果调用签名中具有
alloc
或copy
的方法(或使用基本上等同于+[NSObject new]
的[[NSObject alloc] init]
),则您“拥有”返回的对象,并且您必须使用release
平衡所有权的获得。在所有其他情况下,您不拥有从方法返回的对象。如果要保留它,则必须使用retain
拥有所有权,然后使用release
释放所有权。关于objective-c - 为什么这会造成内存泄漏(iPhone)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/612986/