//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中的对象所有权规则非常简单:如果调用签名中具有alloccopy的方法(或使用基本上等同于+[NSObject new][[NSObject alloc] init]),则您“拥有”返回的对象,并且您必须使用release平衡所有权的获得。在所有其他情况下,您不拥有从方法返回的对象。如果要保留它,则必须使用retain拥有所有权,然后使用release释放所有权。

关于objective-c - 为什么这会造成内存泄漏(iPhone)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/612986/

10-10 20:51