1. 程式人生 > >iOS Block不能修改外部變數的值

iOS Block不能修改外部變數的值

__block int a = 0;

void (^foo)(void) = ^{

   a = 1;

};

        Block不允許修改外部變數的值。Apple這樣設計,應該是考慮到了block的特殊性,block也屬於“函式”的範疇,變數進入block,實際就是已經改變了作用域。在幾個作用域之間進行切換時,如果不加上這樣的限制,變數的可維護性將大大降低。又比如我想在block內聲明瞭一個與外部同名的變數,此時是允許呢還是不允許呢?只有加上了這樣的限制,這樣的情景才能實現。於是棧區變成了紅燈區,堆區變成了綠燈區。

        Block不允許修改外部變數的值,這裡所說的外部變數的值,指的是棧中指標的記憶體地址。__block 所起到的作用就是隻要觀察到該變數被 block 所持有,就將“外部變數”在棧中的記憶體地址放到了堆中。進而在block內部也可以修改外部變數的值。

為什麼從棧到堆就可以修改了呢?

        Block預設的是NSGlobalBlock類似於函式,存放在程式碼段;當block內部使用了外部的變數時,block的存放位置變成了NSMallockBlock(堆),所以用__block修飾後才可以在block內部直接修改該變數。