1

可能重复:
在 Objective-C 中使用 ARC 时 AutoRelease 是多余的吗?

我是 Objective C 的新手,并且了解它的内存管理。我真的很难理解强变量的行为。下面是真正让我困惑的片段。我有以下方法,我正在使用 ARC。

-(void) watchStrongVariable {
    MyClass * myobj = [self getMyClassObject];
    // ...
}

-(MyClass *) getMyclassObject{
    return [[[MyClass alloc] init] autorelease];
}

在第 #2 行中,我将MyClass对象分配给局部变量myobj。我读到所有局部变量默认情况下都是强的,强类似于保留。因此,在上述情况下,我的假设被myobj保留并归方法所有,watchStrongVariable但问题myobj是,如果我们不myobj通过调用显式释放,则保留问题[myobj release]。我看到许多程序遵循相同的模式,但没有发送到的释放消息局部变量。有人可以解释一下为什么myobj在上述情况下不需要释放。

4

3 回答 3

2

One, you can't use explicit retain, release nor autorelease when under ARC - the compiler won't permit it.

Two, you don't have to think about this at all in this case as it's a simple one - when a strong variable goes out of scope, it's equivalent to a release message. So how all this works under ARC is:

- (void)watchStrongVariable
{
    MyClass *myobj = [self myClassObject]; // implicit retain-on-assignment
    // implicit release-on-end-of-scope
}

- (MyClass *)myClassObject
{
    return [[MyClass alloc] init]]; // implicit release-after-return
}

Some advice about coding style. One, don't use getXXXX for getter names - that's reserved for methods which have output artuments (i. e. which accept pointers to be written to), like UIColor's getRed:green:blue:alpha: method. Two, for functions, the opening brace goes on a separate line, and the asterisk indicating pointer types shall be collided with the variable name and not the type. So the best is to write int *i; and not int* i; nor int * i;.

于 2012-09-15T20:56:28.423 回答
2

使用 ARC 时不能使用保留、释放或自动释放,因为 ARC 会为您处理这些。你可以简单地这样做:

- (MyClass *)getMyclassObject {
    return [[MyClass alloc] init];
}

编译器将为您添加自动释放调用。但是 ARC 的重点是不必再考虑太多了。

于 2012-09-15T19:25:27.900 回答
2

使用 ARC 时,您不需要自动释放任何内容。实际上,这会产生编译器错误。

所以在使用 ARC 时这是正确的:

-(MyClass *) getMyclassObject{
    return [[MyClass alloc] init];
}
于 2012-09-15T19:25:41.923 回答