使用访问器将属性设置为新分配的对象会导致内存泄漏

时间:2011-05-16 23:28:01

标签: objective-c memory-management memory-leaks

我只想确认以下是否会导致内存泄漏。

.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来说并不合适,所以请随意指出一个更好的地方来问这类问题。

3 个答案:

答案 0 :(得分:5)

是的,这是完全正确的。

答案 1 :(得分:3)

你可以这样做。或者,既然我们知道setter会自动保留,我们可以执行以下操作而不是自动释放:

foo=[[MyObject alloc] init];

您选择的可能是编码风格的问题。如果你想要使用self.foo,那么一定要使用你的方法来保持一致性和bug修复。如果您习惯使用点语法,请使用后者。

答案 2 :(得分:3)

另一种常见模式:

MyObject *newFoo = [[MyObject alloc] init];
self.foo = newFoo;
[newFoo release];