正确的行为取决于editMyObject @property的声明.假设它是delcared
@property (retain) id editMyObject; //id may be replaced by a more specific type
要么
@property (copy) id editMyObject;
然后通过self.editMyObject =
保留或复制指定的对象进行分配.由于[[MyObject alloc] init]
返回一个保留的对象,你作为调用者拥有的对象,你有一个额外的MyObject实例保留,因此它将泄漏,除非它有匹配的版本(如在第二个块中).我建议你阅读内存管理编程指南 [2].
假设属性如上所述声明,则第二个代码块是正确的.
ps你不应该[self.editMyObject release]
在-dealloc
方法中使用.你应该打电话[editMyObject release]
(假设ivar支持@property被调用editMyObject
).调用访问器(通过self.editMyObject
@synthesized访问器是安全的,但如果覆盖访问器依赖于对象状态(可能在调用位置无效-dealloc
或导致其他副作用),则通过调用访问器会出现错误.
[2] Cocoa中的对象所有权规则非常简单:如果你调用一个方法alloc
,或者copy
在其签名中(或者使用+[NSObject new]
它基本上等同于[[NSObject alloc] init]
),那么你"拥有"返回的对象,你必须平衡你的获取拥有所有权release
.在所有其他情况下,您不拥有从方法返回的对象.如果你想保留它,你必须拥有一个retain
,并在以后释放所有权release
.
正确的行为取决于editMyObject @property的声明.假设它是delcared
@property (retain) id editMyObject; //id may be replaced by a more specific type
要么
@property (copy) id editMyObject;
然后通过self.editMyObject =
保留或复制指定的对象进行分配.由于[[MyObject alloc] init]
返回一个保留的对象,你作为调用者拥有的对象,你有一个额外的MyObject实例保留,因此它将泄漏,除非它有匹配的版本(如在第二个块中).我建议你阅读内存管理编程指南 [2].
假设属性如上所述声明,则第二个代码块是正确的.
ps你不应该[self.editMyObject release]
在-dealloc
方法中使用.你应该打电话[editMyObject release]
(假设ivar支持@property被调用editMyObject
).调用访问器(通过self.editMyObject
@synthesized访问器是安全的,但如果覆盖访问器依赖于对象状态(可能在调用位置无效-dealloc
或导致其他副作用),则通过调用访问器会出现错误.
[2] Cocoa中的对象所有权规则非常简单:如果你调用一个方法alloc
,或者copy
在其签名中(或者使用+[NSObject new]
它基本上等同于[[NSObject alloc] init]
),那么你"拥有"返回的对象,你必须平衡你的获取拥有所有权release
.在所有其他情况下,您不拥有从方法返回的对象.如果你想保留它,你必须拥有一个retain
,并在以后释放所有权release
.
您的属性被声明为"retain",这意味着传入的对象会自动保留.
因为你的对象已经有来自alloc/init的引用计数为1,所以有两个引用,我假设只有一个版本(在你的析构函数中).
基本上对self.editMyObject的调用实际上是这样做的;
-(void) setEditMyObject:(MyObject*)obj { if (editMyObject) { [editMyObject release]; editMyObject = nil; } editMyObject = [obj retain]; }