簡(jiǎn)單的說宝磨,我能想到的block循環(huán)引用的情況有三種:(望各路大神補(bǔ)充,謝謝)
1.在A類中調(diào)用自身A類的block盅安,并在block中調(diào)用A類的屬性或方法(self.name ?或 [self doSomething];)
2.在B類中初始化A類唤锉,調(diào)用A類的block中,又調(diào)用B類的屬性或方法(self.namexxx? 或 [self doSomething];)
3.在A類的某個(gè)控件(如A.button)有block方法别瞭,在調(diào)用A.button的block方法的時(shí)候窿祥,在這個(gè)block塊兒中又調(diào)用了A的其它屬性或在方法(如A.label.text = @"";)
解決方法:弱引用self
1.__weak typeof(self) weakSelf = self;
或2.__weak YourViewController *weakSelf = self;
在block塊兒中用weekSelf替換所有的self;
解釋說明:
1.self調(diào)用self.block時(shí)A強(qiáng)引用了block,即A持有block蝙寨,在block塊中調(diào)用self.name則block強(qiáng)引用了A晒衩,即block持有A嗤瞎,這樣A和block相互持有,就會(huì)造成循環(huán)引用浸遗,誰都無法正常釋放猫胁。
2.A在B中初始化,則B持有A跛锌,在B中調(diào)用A.block則A持有A的block弃秆,block中調(diào)用B的屬性self.name_B,則block持有B,這樣B->A->block->B,形成循環(huán)引用髓帽,A菠赚、B、block都無法正常釋放郑藏。
3.A中調(diào)用控件A.button衡查,則A持有A.button,調(diào)用控件的block方法則是A.button持有block必盖,block在調(diào)用A中的其它控件或者屬性方法self.label則block持有self即A拌牲,這樣A->A.button->A.button.block->A,形成循環(huán)引用,導(dǎo)致A類無法正常釋放歌粥。
解決方法用弱引用的意思則是打破循環(huán)塌忽,使得在block中無法對(duì)本類即self/A強(qiáng)引用,從而使block和self都能正常釋放失驶。
注意:并非所有情況都要一昧的用弱引用土居,有些情況下為了防止提前釋放,而刻意使用強(qiáng)引用嬉探,或者對(duì)弱引用進(jìn)行強(qiáng)引用的情況擦耀。
---本人小白小菜,歡迎各路大神打臉指正涩堤。orz