考虑以下代码片段:
for(/* some condition */) {
int x = rand();
[array addObject:^(){
NSLog(@"%d", x);
}]
}
for(void (^block)() in array) {
block();
}
现在,我希望该代码段可以打印出该for循环中分配给x的所有值;但是似乎所有块都共享相同的“x”变量(可能是最后一个变量)。
知道为什么会这样,以及如何修复代码以使每个块都包含变量“x”,就像定义该块时一样吗?
最佳答案
该文档特别是says not to do this。原因是块是在堆栈上分配的,这意味着它们可能超出范围。出于同样的原因,您不能在第一个x
循环之外访问变量for
,因此也不应使用该块。 x
和块本身已超出范围,可以包含任何值。
为了解决这个问题,您可以像下面这样复制该块:
for(/* some condition */) {
int x = rand();
void(^logBlock)() = ^() { NSLog(@"%d", x); }
[array addObject:[[logBlock copy] autorelease]];
}
这会将块移到堆上,应该可以解决问题。