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