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

Chr*_*ner 2 memory-leaks memory-management objective-c

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

.h文件

@property (nonatomic, retain) MyObject *foo;
Run Code Online (Sandbox Code Playgroud)

.m文件

@synthesize foo;
...

self.foo = [[MyObject alloc] init];
Run Code Online (Sandbox Code Playgroud)

dealloc 设置为

[foo release];
Run Code Online (Sandbox Code Playgroud)

我的理解是自动生成的访问器方法的实现看起来像

-(void)setFoo:(MyObject *)newObject {
    if (foo != newObject) {
        [foo release];
        foo = [newObject retain];
    }
}
Run Code Online (Sandbox Code Playgroud)

self.foo = [[MyObject alloc] init];现在走过来读给我看,"分配了一个新的MyObject对象,其保留计数为1,传递给它setFoo:,foo永远不会等于myObject,因为它是新分配的,所以释放旧值,增加newObject的保留计数制作2并将其分配给foo"

dealloc释放foo因此将其retain count设置为1,这意味着该对象被泄露了?

为了安全地做到这一点,我们应该编写我们的代码

self.foo = [[[MyObject alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

我的理解是否正确?

编辑

我意识到这个问题并不适合SO,所以请随意指出一个更好的地方来问这类问题.

Eri*_*lje 5

是的,这是绝对正确的.