和以前一样,我们通常会像这样做一些循环:
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];
}
}
答案 0 :(得分:3)
您的第二个代码块(使用ARC编译)与第一个代码块(使用MRC编译)具有完全相同的语义。
在ARC下,当您将强对象引用设置为nil,或强力对象引用被销毁时,ARC会负责为您发送release
消息。在这两个示例中,number
变量在循环体的末尾被销毁,因此(在第二个示例中)ARC释放被引用的number
的对象。
在第三个示例中,@autoreleasepool
将导致返回的NSNumber
在每次循环中被释放。这可能是大量循环迭代所必需的。只需要五次迭代,每次迭代创建一个NSNumber
,就没有必要了。
答案 1 :(得分:2)