那爲何能夠修改他們呢?看下面的分析spa
clang 轉換後的代碼以下: 能夠發現block結構體中沒有增長a 和 b 變量, 也就是說轉換後,對於全局變量 和 靜態全局變量的訪問方式和轉換前徹底同樣。指針
再看 靜態局部變量c 是怎麼轉換的圖片
將c的地址 傳給了Block 構造方法作用域
對於靜態局部變量,block的處理是:將靜態局部變量的地址保存在block中,調用的時候,取出block中這個指針變量,從而獲得靜態變量的值,進行操做。變量
__block相似於static auto register 等說明符,做用是:將變量值設置到哪一個存儲域中。方法
好比 auto 表示做爲自動變量存儲在棧中im
static 表示做爲靜態變量存儲在靜態區static
__block 變量 轉換後到底什麼樣的呢?img
能夠看到變成了一個 __Block_byref_a_0 的結構體,這個結構體以下:(圖片看不清能夠放大)co
這個結構體自己中就有一個變量int a 來存儲 咱們定義的__block int a 的值。
即:__block 將int a 變成了一個叫 __Block_byref_a_0 的結構體,而且結構體中存儲這個這個a 的值。這個__block int a = 1; 就變成了一個結構體類型的局部變量,它存在棧區。
再看給__block int a 賦值的代碼
轉換以下:
首先 Block 結構體 __main_block_impl_0 中持有 __block結構體 __Block_byref_a_0 *a
接着 __block結構體 __Block_byref_a_0 中的__forwaring 持有指向該實例自身的指針,經過成員變量__forwaring訪問成員變量 a ( a 是__Block_byref_a_0 實例自身持有的變量,保存了int a 的值)
有2個疑問:__forwaring存在的理由是什麼?
block超出變量做用域可存在的理由?
下一篇我會說明。