__block的作用:
1.block內部想要修改block外部臨時變數的值 2.特殊情況下為避免迴圈引用,可以給響應物件加上__block修飾符
原理:
1.block內部想要修改block外部臨時變數的值
block的執行後會被轉換為__main_block_impl_0
結構體例項,在__main_block_impl_0
的構造方法中,臨時變數作為引數被傳入,儲存在結構體中。
正常執行中,外部區域性變數和__main_block_impl_0
構造方法中的變數已經不在同一個作用域中,所以無法修改。
__block的作用是,將被修飾的變數轉換成__Block_byref_(變數名)_0
結構體,該結構體會包含一個對該結構體例項本身的引用。
上述__main_block_impl_0
函式中包含臨時變數轉換的成員變數,所以我們從__cself找到的區域性變數實際上就是外部區域性變數本身,所以就可以做修改了。
2.特殊情況下為避免迴圈引用,可以給響應物件加上__block修飾符
被__block修飾的變數會被_Block_object_assign函式持有,當block被釋放的時候會使用_Block_object_dispose函式釋放該變數,這樣就解決迴圈引用問題了。
使用__block需要注意的是,只有block被釋放之後才會釋放被修飾的變數。
有志者、事竟成,破釜沉舟,百二秦關終屬楚;
苦心人、天不負,臥薪嚐膽,三千越甲可吞吳.