iOS block截獲變量

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 截獲的值。



發佈了70 篇原創文章 · 獲贊 45 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章