美文网首页
block的循环引用问题

block的循环引用问题

作者: 舞尐屮 | 来源:发表于2016-07-21 09:43 被阅读70次

    简单的说,我能想到的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

    相关文章

      网友评论

          本文标题:block的循环引用问题

          本文链接:https://www.haomeiwen.com/subject/slkbjttx.html