6
は、次のコードを考えてみましょう:ブロック、ループやローカル変数
for(/* some condition */) {
int x = rand();
[array addObject:^(){
NSLog(@"%d", x);
}]
}
for(void (^block)() in array) {
block();
}
今私は、このコードスニペットは、ループのためにその中のxに割り当てられたすべての値をプリントアウトすることを期待します。しかし、すべてのブロックが同じ 'x'変数(おそらく最後の変数)を共有しているようです。
これはなぜそうであり、ブロックが定義されたときのように各ブロックに変数 'x'が含まれるようにコードを修正することができますか?
私はまだブロックを自分で学習していますが、ここでは奇妙なことが一つあります。 addObject:を実行すると、配列はデフォルトでブロックオブジェクトを保持します。しかし、ブロックオブジェクトは宣言されたときにスタックに置かれるため、ここではすぐに範囲外になるように見えます。 Block_Copyはブロックをヒープに移動します。このヒープは正しいことのようです。 –