【问题标题】:What will happen when autorelease object is assigned to strong variable [duplicate]将自动释放对象分配给强变量时会发生什么
【发布时间】:2012-09-08 13:13:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    当您使用 ARC 时,您不能使用 retain、release 或 autorelease,因为 ARC 会为您解决这些问题。你可以这样做:

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

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

    【讨论】:

      【解决方案2】:

      在使用 ARC 时,您不需要自动释放任何东西。事实上,这会产生编译错误。

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

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

      【讨论】:

      • "事实上,这会产生一个编译器警告。"而是一个错误 - 警告不是致命的,但这个是。 +1 虽然。
      • 谢谢H2CO3,你是对的。我修改了答案。
      【解决方案3】:

      第一,在 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 名称——这是为具有输出参数的方法保留的(即接受要写入的指针),例如UIColor 的getRed:green:blue:alpha: 方法。 二,对于函数,左大括号单独一行,星号指示指针类型应与变量名而不是类型冲突。所以最好写int *i; 而不是int* i; 也不是int * i;

      【讨论】:

      • 感谢您的所有回复。我会考虑所有的建议。如果在上述情况下我没有使用 ARC,会有什么影响,是否需要释放 myobj 以及为什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多