如何在没有@autoreleasepool块的情况下在ARC下循环管理内存

时间:2013-06-08 02:09:39

标签: objective-c automatic-ref-counting

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

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];
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

在第三个示例中,@autoreleasepool将导致返回的NSNumber在每次循环中被释放。这可能是大量循环迭代所必需的。只需要五次迭代,每次迭代创建一个NSNumber,就没有必要了。

答案 1 :(得分:2)

是的,ARC会将您的第二个示例翻译成第一个示例。

您可以阅读更多here (apple docs)here (dr. dobbs)

自动释放池示例也应该是等效的,llvm docs