和以前一样,我们通常为循环做一些类似于这样的事情:
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];
}
}发布于 2013-06-08 02:22:59
第二个代码块(用ARC编译)与第一个代码块(用MRC编译)的语义完全相同。
在ARC下,当您将强对象引用设置为零、或强对象引用被销毁时()时,ARC负责为您发送release消息。在这两个示例中,number变量在循环体的末尾被销毁,因此(在第二个示例中) ARC释放number引用的对象。
在您的第三个示例中,@autoreleasepool将导致在每次遍历循环时释放返回的NSNumber。对于大量循环迭代来说,这可能是必要的。对于五个迭代,每个迭代都创建一个NSNumber,这是不必要的。
发布于 2013-06-08 02:21:00
是的,ARC会把你的第二个例子翻译成第一个。
您可以阅读更多的这里(苹果文档)和这里(博士)(杜布斯)。
自动释放池示例也应该是等效的,llvm文档
https://stackoverflow.com/questions/16995328
复制相似问题