【问题标题】:When using ARC, is there a difference between [[NSArray alloc] init] and the "autorelased" [NSArray array]? [duplicate]使用 ARC 时,[[NSArray alloc] init] 和“自动相关”[NSArray array] 之间有区别吗? [复制]
【发布时间】:2012-06-25 17:37:45
【问题描述】:

可能重复:
Objective-C: With ARC, what's better? alloc or autorelease initializers?

ARC 是否会自动将类初始值设定项的自动发布版本转换为适当的非自动发布版本,还是在技术上它们仍在自动发布?

我不想将内存保留的时间超过绝对需要的时间,因此我养成了在几乎所有情况下都使用 alloc/init 的习惯。现在在 ARC 中,我想知道我是否可以开始使用“自动释放”初始化程序并期望它们像非自动释放版本一样表现......

有没有人有任何文档说明我在哪里可以找到 ARC 下自动发布的方法会发生什么?

【问题讨论】:

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


【解决方案1】:

当您获得自动释放对象时,ARC 将设法避开自动释放池,只要您的代码和调用的方法/函数都使用 ARC 编译

ARC 在您的代码中添加对objc_retainAutoreleasedReturnValue 的调用,并在被调用的函数/方法中添加对objc_autoreleaseReturnValue 的调用。在运行时,当objc_autoreleaseReturnValue 看到返回的值将由objc_retainAutoreleaseReturnValue 保留时,它不会自动释放对象并设置一个标志来告诉objc_retainAutoreleaseReturnValue 不要保留该对象。因此,使用方便的创建方法而不是alloc/init,您不会获得(可察觉的)额外成本。

有关该机制的更多信息,您可以阅读 Matt Galloway 的 How does objc_retainAutoreleasedReturnValue work?

总之,只要使用你喜欢的方法,Apple 工程师就会确保它运行得很快。

【讨论】:

  • 谢谢,这解释得很好!
【解决方案2】:

从技术上讲,它们并不相同,因为 ARC 只是在编译时将“保留”和“释放”插入到您的代码中(在必要时)。

【讨论】:

    【解决方案3】:

    如果在初始化对象时使用指针,ARC 会存储对对象的强引用,否则它会立即释放对象。所以我相信你关于 NSArray 的问题的答案是不,ARC 不会把它变成一个自动释放的对象。每当范围内不再需要该对象时,它还会在代码中添加一个 release 语句:

    -(void) aMethod
    {
        [NSArray alloc];
    }
    
    //in essence is transformed into
    
    -(void) aMethod
    {
        NSArray *temp = [NSArray alloc];
        [temp release];
    }
    

    如果您存储了一个指针,ARC 会在对象即将离开作用域时添加释放。

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2011-07-22
      • 1970-01-01
      • 2012-10-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多