Block原理 - block是怎麼修改外部變量的值

1.能夠修改全局變量、靜態全局變量、靜態局部變量。

那爲何能夠修改他們呢?看下面的分析spa

 

clang 轉換後的代碼以下: 能夠發現block結構體中沒有增長a 和  b 變量, 也就是說轉換後,對於全局變量 和 靜態全局變量的訪問方式和轉換前徹底同樣。指針

 

再看 靜態局部變量c 是怎麼轉換的圖片

將c的地址 傳給了Block 構造方法作用域

對於靜態局部變量,block的處理是:將靜態局部變量的地址保存在block中,調用的時候,取出block中這個指針變量,從而獲得靜態變量的值,進行操做。變量

 

 

2.還能夠使用    __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超出變量做用域可存在的理由?

下一篇我會說明。

相關文章
相關標籤/搜索