block截獲變量是什麼意思?我們先來看一段代碼:
int i = 10;
void (^block)(void) = ^{
NSLog(@"In block, i = %d", i);
};
i = 200;
block();
NSLog(@"i = %d", i);
這段代碼的輸出結果是什麼呢?控制檯輸出結果爲:
有人肯定會想,在 block 執行之前已經把變量 i 的值改成 20 了,爲什麼在block中打印 i 的值卻是 10 呢?
在iOS中,我們在聲明 block 時 i 的值就被 block 截獲了並保存,所以聲明 block 後,在block外修改變量的值,也不會對block內所截獲的值產生影響。即便我們在 block 內部設置 i = 30,也是不被允許的,會報錯“ Variable is not assignable (missing __block type specifier) ”。
那麼問題來了,如果我想要在外面改變變量的值並同步到 block 內應該怎麼辦?看下面的代碼
__block int i = 10;
void (^block)(void) = ^{
NSLog(@"In block, i = %d", i);
};
i = 20;
block();
NSLog(@"i = %d", i);
輸出結果如下:
與前段代碼的區別是,我們在聲明 i 變量時在前面加了 __block 修飾。在iOS中,被 __block 修飾的變量稱爲 __block 變量,這種變量不管是在block內還是block外都可以修改其被 block 截獲的值。