简单的说,我能想到的block循环引用的情况有三种:(望各路大神补充,谢谢)
1.在A类中调用自身A类的block,并在block中调用A类的属性或方法(self.name 或 [self doSomething];)
2.在B类中初始化A类,调用A类的block中,又调用B类的属性或方法(self.namexxx 或 [self doSomething];)
3.在A类的某个控件(如A.button)有block方法,在调用A.button的block方法的时候,在这个block块儿中又调用了A的其它属性或在方法(如A.label.text = @"";)
解决方法:弱引用self
1.__weak typeof(self) weakSelf = self;
或2.__weak YourViewController *weakSelf = self;
在block块儿中用weekSelf替换所有的self;
解释说明:
1.self调用self.block时A强引用了block,即A持有block,在block块中调用self.name则block强引用了A,即block持有A,这样A和block相互持有,就会造成循环引用,谁都无法正常释放。
2.A在B中初始化,则B持有A,在B中调用A.block则A持有A的block,block中调用B的属性self.name_B,则block持有B,这样B->A->block->B,形成循环引用,A、B、block都无法正常释放。
3.A中调用控件A.button,则A持有A.button,调用控件的block方法则是A.button持有block,block在调用A中的其它控件或者属性方法self.label则block持有self即A,这样A->A.button->A.button.block->A,形成循环引用,导致A类无法正常释放。
解决方法用弱引用的意思则是打破循环,使得在block中无法对本类即self/A强引用,从而使block和self都能正常释放。
注意:并非所有情况都要一昧的用弱引用,有些情况下为了防止提前释放,而刻意使用强引用,或者对弱引用进行强引用的情况。
---本人小白小菜,欢迎各路大神打脸指正。orz