将autorelease对象分配给强变量时会发生什么

时间:2012-09-15 19:21:44

标签: objective-c automatic-ref-counting autorelease

  

可能重复:
  Is AutoRelease redundant when using ARC in Objective-C?

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

编译器会为您添加自动释放调用。但ARC的重点在于不再需要考虑这个问题了。

答案 1 :(得分:2)

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

使用ARC时这是正确的:

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

答案 2 :(得分:2)

其一,在ARC下,您不能使用显式retainreleaseautorelease - 编译器不会允许它。

二,在这种情况下你根本不需要考虑这个问题,因为它很简单 - 当一个强变量超出范围时,它等同于release消息。那么这一切在ARC下的运作方式是:

- (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
}

关于编码风格的一些建议。一,不要将getXXXX用于getter名称 - 这是为具有输出artuments的方法保留的(即接受要写入的指针),如UIColor的getRed:green:blue:alpha:方法。 二,对于函数,左大括号在一条单独的行上,指示指针类型的星号应与变量名而不是类型相冲突。所以最好是写int *i;而不是int* i;也不是int * i;