iOS __block修飾符

Perfect_Dream發表於2017-12-20

__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被釋放之後才會釋放被修飾的變數。



有志者、事竟成,破釜沉舟,百二秦關終屬楚;

苦心人、天不負,臥薪嚐膽,三千越甲可吞吳.

相關文章