1

和以前一样,我们通常会做这样的 for 循环:

for (int i = 0 ; i < 5; i ++) {
    NSNumber * number = [[NSNumber alloc] initWithInt:i];
    [muArray addObject:number];
    [number release];
}

但是在 ARC 下,没有release. 我可以在没有@autorelease块的情况下管理内存,像这样(直接删除释放语句):

for (int i = 0 ; i < 5; i ++) {
    NSNumber * number = [[NSNumber alloc] initWithInt:i];
    [muArray addObject:number];
}

同样,有@autoreleasepool必要这样吗?

for (int i = 0 ; i < 5; i ++) {
    @autoreleasepool{
        NSNumber * number = [NSNumber numberWithInt:i];
        [muArray addObject:number];
    }
}
4

2 回答 2

3

您的第二个代码块(使用 ARC 编译)与您的第一个代码块(使用 MRC 编译)具有完全相同的语义。

在 ARC 下,当您将强对象引用设置为 nil 时,或者当强对象引用被破坏时,ARC 会release为您发送消息。在这两个示例中,number变量在循环体的末尾被销毁,因此(在第二个示例中)ARC 释放number引用的对象。

在您的第三个示例中,@autoreleasepool将导致NSNumber在每次通过循环时释放返回的内容。这对于大量循环迭代可能是必要的。只需五次迭代,每次都创建一个NSNumber,这是没有必要的。

于 2013-06-08T02:22:59.850 回答
2

Yes, ARC will translate your second example into the first.

You can read more here (apple docs) and here (dr. dobbs).

The autorelease pool example is should also be equivalent, llvm docs

于 2013-06-08T02:21:00.360 回答