woshidan's loose leaf

ぼんやり勉強しています

ブロックの中でローカル変数を変更したい

ローカル変数は何も修飾子をつけていないとブロックの中で参照はできても変更はできない。

// ダメな例
int count = 0;
[Util executeSomeBlock:^{
  count += 1; // ビルドできない
}];

これだとちょっとしたことを他のスレッドに投げてその結果を受け取りたい、という時不便。 staticつけて静的変数にしたらブロックの中で変更できるようになるが、それでは変数のスコープが必要以上に大きくなってしまう。 こういう、ブロックの中でローカル変数を変更したいときは、変数に __block 修飾子をつけるとできます。

// いける例
__block int count = 0;
[Util executeSomeBlock:^{
  count += 1; // 変更できる!
}];