結論: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...