block 迴圈引用

2021-07-11 07:25:10 字數 1801 閱讀 3101

結論:block作為成員變數,內部引用self的成員變數,必須使用self 弱引用

block作為區域性變數,無論怎樣寫,都不會對self造成強引用

block為變數

(1)block為成員變數

typedef

nsstring*(^blockcc)(void);

@inte***ce

twoviewcontroller ()

@end

-(void)buttonaction:(uibutton *)button

;nsstring *a = _block();

[self dismissviewcontrolleranimated:yes completion:^];

}-(void)dealloc

測試結果:dealloc 方法沒有呼叫  上面例子直接引用self 

block作為成員變數 ,block實現函式內呼叫成員變數,也會間接強引用self

-(void)buttonaction:(uibutton *)button

;nsstring *a = _block();

[self dismissviewcontrolleranimated:yes completion:^];

}

測試結果:dealloc 方法沒有呼叫,block還是間接強引用self,造成迴圈引用
-(void)buttonaction:(uibutton *)button

; nslog(@"嘎嘎");

nsstring *a = _block();

[self dismissviewcontrolleranimated:yes completion:^];

}-(void)test

以上**中,block函式中使用weakself 呼叫的函式中使用了self,會不會造成迴圈引用?

測試結果:

2016-04-21 17:53

:15.364

blockmemorytest

[6144:209239] 嘎嘎

2016-04-21 17:53

:15.365

blockmemorytest

[6144:209239]

block

excute

2016-04-21 17:53

:15.365

blockmemorytest

[6144:209239]

test

function

excute:

2016-04-21 17:53

:15.868

blockmemorytest

[6144:209239]

twoviewcontroller

dealloc

答案:不會

(2)block作為區域性變數呼叫

-(void)buttonaction:(uibutton *)button

; nsstring *a = blockcc();

[self dismissviewcontrolleranimated:yes completion:^];

}

測試結果:dealloc方法呼叫  區域性變數的block不會造成迴圈應用(猜測內部原因可能self 沒有強引用block)

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...

block迴圈引用問題

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...