我只想确认以下是否会导致内存泄漏。
.h文件
@property (nonatomic, retain) MyObject *foo;
.m文件
@synthesize foo;
...
self.foo = [[MyObject alloc] init];
dealloc
设置为
[foo release];
我的理解是自动生成的访问器方法的实现看起来像
-(void)setFoo:(MyObject *)newObject {
if (foo != newObject) {
[foo release];
foo = [newObject retain];
}
}
遍历self.foo = [[MyObject alloc] init];
现在读给我看,“分配了一个新的MyObject对象,其保留计数为1,将其传递给setFoo:
,foo永远不会等于myObject,因为它是新分配的,所以释放旧值,增加newObject的保留计数,使其 2 并将其分配给foo“
dealloc释放foo因此将其保留计数设置为 1 ,这意味着此对象被泄露了?
为了安全地做到这一点,我们应该编写像
这样的代码self.foo = [[[MyObject alloc] init] autorelease];
我的理解是否正确?
修改
我意识到这个问题对SO来说并不合适,所以请随意指出一个更好的地方来问这类问题。
答案 0 :(得分:5)
是的,这是完全正确的。
答案 1 :(得分:3)
foo=[[MyObject alloc] init];
您选择的可能是编码风格的问题。如果你想要使用self.foo,那么一定要使用你的方法来保持一致性和bug修复。如果您习惯使用点语法,请使用后者。
答案 2 :(得分:3)
另一种常见模式:
MyObject *newFoo = [[MyObject alloc] init];
self.foo = newFoo;
[newFoo release];