探究一
是否所有的 Block 中烈钞,使用 self 都會(huì)導(dǎo)致循環(huán)引用?
如圖,使用系統(tǒng)自帶的 UIView 的 Block 穆壕,控制器能被銷毀-->說(shuō)明沒有發(fā)生循環(huán)引用。
原理:UIView 調(diào)用的是類方法其屏,當(dāng)前控制器不可能強(qiáng)引用一個(gè)類喇勋,所以循環(huán)引用無(wú)法形成-->動(dòng)畫 Block 不會(huì)造成循環(huán)引用的原因。
所以通過(guò)實(shí)踐得出第一個(gè)結(jié)論-->并不是所有的 Block 中使用 self漫玄,都會(huì)導(dǎo)致循環(huán)引用茄蚯!
探究二
除了系統(tǒng)自帶的 Block,在其他 Block 中使用 self 會(huì)導(dǎo)致循環(huán)引用嗎睦优?
AFN框架
如上圖所示渗常,在 AFN 的 block 使用 self,并不會(huì)導(dǎo)致循環(huán)引用汗盘。
原因:因?yàn)?self 不持有 AFN 的 block皱碘,只是 AFN 的 block 持有 self,僅僅是單向持有隐孽,并沒有相互強(qiáng)引用~所以不會(huì)造成循環(huán)引用癌椿。
探究三
那什么情況下會(huì)導(dǎo)致循環(huán)引用呢?-->自定義 Block
添加 viewDidLoad 提示框-->每次進(jìn)入都打印 viewDidLoad 菱阵,可以確定是否離開試圖控制器踢俄,如果是,但是沒有調(diào)用 dealloc -->循環(huán)引用
循環(huán)引用發(fā)生了晴及,所以都办,在實(shí)際開發(fā)中,使用自定義 Block虑稼,在 Block{} 中使用 self 琳钉,導(dǎo)致了循環(huán)引用。
循環(huán)引用導(dǎo)致的原因:相互強(qiáng)指向
如何解決:使用 weakSelf
如果是自己寫的 Block蛛倦,(非系統(tǒng)和 AFN )歌懒,在 Block 中使用 self ,是否一定會(huì)發(fā)生循環(huán)引用溯壶?
探究四
自定義 Block 是否一定會(huì)發(fā)生循環(huán)引用及皂?
如圖:發(fā)現(xiàn) oneVC 被銷毀了甫男,說(shuō)明,自己定義的 Block 躲庄,使用了 self 查剖,并不一定會(huì)發(fā)生循環(huán)引用!
原理:Block 強(qiáng)指向了 self噪窘,但是 self笋庄,并沒有指向 Block,并沒有一個(gè) self.block 或者成員變量 block倔监,所以 block 并沒有被強(qiáng)指向直砂,沒有發(fā)生循環(huán)引用。
Tips:循環(huán)引用發(fā)生的條件就是持有這個(gè) block ?的對(duì)象浩习,在 block 里邊加入的對(duì)象持有静暂。