考虑以下代码片段:

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]];
}

这会将块移到堆上,应该可以解决问题。

10-05 20:53
查看更多