blockの中で、外にある変数を使う方法のメモ。
(iOS 5で試しています)
blockの外にある変数を block 内部で使う場合、
「値のコピー」
が発生しています。block を代入した時点での外の変数の値を使うことになるため、blockに式を代入した後で、変数の値を変更しても反映されません。
(反映したい場合は、__block を変数の前に付けたりします。 )
サンプルコード
– (void)viewDidLoad
{
[superviewDidLoad];
int y = 5;
void (^block)() = ^{
int x = 3;
NSLog(@”足すと %d”, x + y);
};
// ここで実行
block();
// y を変更してから実行
y = 10;
block();
//block をもう一度代入してみる。
block = ^{
int x = 3;
NSLog(@”足すと %d”, x + y);
};
// もう一回
block();
}
実行すると、こんな感じのログになります。
Block内部では定義した時点の値をコピーして持ってるため、
最初の二つは同じあたい、blockを再定義したあとは新しいyの値です。
足すと 8
足すと 8
足すと 13