块,循环和局部变量

时间:2011-10-13 07:41:20

标签: objective-c closures objective-c-blocks

考虑以下代码片段:

for(/* some condition */) {
   int x = rand();
   [array addObject:^(){
       NSLog(@"%d", x);
   }]
}

for(void (^block)() in array) {
    block();
}

现在我希望这段代码片段打印出for循环中分配给x的所有值;但似乎所有的块共享相同的'x'变量(可能是最后一个)。

知道为什么会这样,以及我如何修复代码以使每个块包含变量'x',就像定义块时一样?

1 个答案:

答案 0 :(得分:7)

文档具体says not to do this。原因是块在堆栈上分配,这意味着它们可能超出范围。出于同样的原因,您无法访问第一个x循环之外的变量for,您也不应该使用该块。 <{1}}已经超出范围,与块本身一起,并且可以包含任何值。

为了解决这个问题,您可以像这样使用该块的副本:

x

这会将块移动到堆上,并且应该解决您的问题。