Block的迴圈引用

2021-07-06 07:31:40 字數 505 閱讀 8902

block是ios 4開始匯入的,類似lambda表示式,但是在使用block的過程中,很有可能引起引用迴圈。如下圖所示

當我們遇到這種情況時,可以有兩種解決方案。

__block修飾符

...

__block id temp = self;

void(^block)(void) = ^

block();

...

通過執行block方法,nil被賦值到__block變數temp中。這個時候__block變數對self的強引用失效,從而避免迴圈引用的問題。但是如果block()沒有執行的話,迴圈引用一直存在。

__weak修飾符

...

__weak id temp = self;

void(^block)(void) = ^

block();

...

由於__weak 修飾的物件不擁有所有權,所以就打破迴圈引用。

block 迴圈引用

結論 block作為成員變數,內部引用self的成員變數,必須使用self 弱引用 block作為區域性變數,無論怎樣寫,都不會對self造成強引用 block為變數 1 block為成員變數 typedef nsstring blockcc void inte ce twoviewcontroll...

block迴圈引用

底層原始碼 typedef void ghblock void struct main block impl 0 static void main block func 0 struct main block impl 0 cself static void main block copy 0 st...

BLOCK迴圈引用

何時block才會迴圈引用 為什麼block會迴圈引用 我們很多行為會導致block的copy,而當block被copy時,會對block中用到的物件產生強引用 arc下 或者引用計數加一 mrc下 如下 property nonatomic,readwrite,copy completionblo...