說到循環引用問題,想必你們都碰到過吧,好比在使用Block的時候,使用__weakSelf來代替self解決等,可是對於這個,仍是有很多能夠探索的點,下面我就來講下,但願對你們有所幫助。網絡
是否全部的Block中,使用self都會致使循環引用?動畫
答案是否認的!以下面所示的這種狀況spa
如上,使用系統自帶的UIView的Block,控制器能夠被銷燬,說明並無發生循環引用。3d
緣由:UIView調用的是類方法,當前的控制器不可能強引用一個類,因此循環沒法造成,動畫的block不會形成循環引用code
除了系統自帶的某些Block不會引發循環引用外,咱們你們常使用的AFN中的block是否循環引用呢?答案以下圖所示:blog
很明顯,經過Log能夠看到它不會致使循環引用開發
緣由:AFN無循環是由於絕大部分狀況下,使用的網絡類是不會被當前控制器引用的,這時就不會造成引用環(查資料得知)class
那什麼狀況下會致使循環引用呢?--> 自定義的Blocktest
咱們在viewDidKLoad中打印,在該控制器每次進入都會打印,在該控制器消失的時候,若是沒有調用dealloc,說明該block引發了循環引用變量
如上圖,咱們發現log中並無打印「-[SecondViewController viewDidLoad] --->dealloc」。說明block中使用self,致使了循環引用
致使循環引用的緣由:相互強指向
解決方法:使用weakSelf
__weak typeof(self) weakSelf = self; _testBlock = ^ { NSLog(@"%@",weakSelf.view); };
如上所說,那麼自定義Block是否必定會發生循環引用?
如圖:咱們發現oneVC被銷燬了,說明自定義的Block,裏面使用self,並不必定發生循環引用
原理:block-->強指向了self,可是self,並無指向Block。並無一個self.xxBlcok或者成員變量block,全部的block並無被強指向,因此沒有發生循環引用
既然系統的Block、AFN都不會發生循環引用,自定義的Block循環引用會有⚠️提示,那麼實際開發中真的不會遇到循環引用?
在實際開發中,使用通知,調用系統自帶的Block方法,在block中使用self,會發生循環引用
咱們在ThirdVC中發送通知給SecondVC
在SecondVC中接收通知
當從SecondVC pop回OneVC時,SecondVC並無調用dealloc,說明存在循環引用,當時控制器沒法銷燬。這是由於在通知的方法的Block中使用了self,可是此次並無提示,不過確實是發生了循環引用!
解決方法:使用weakSelf!
總結:
以上就是所有內容了,但願對看到的各位有所幫助,若是存在疑問或者發現任何問題你們能夠瀏覽交流。