美文网首页
iOS_循环引用的特殊案例:strong后,self为nil

iOS_循环引用的特殊案例:strong后,self为nil

作者: 天蓬大元 | 来源:发表于2020-11-10 09:38 被阅读0次

    最近在工作中,遇到了一个很有意思的事情。

    为了解决block的循环引用问题。我对self对象,在block外部使用了weak,然后在block内部使用了strong。但调试代码发现,当block被执行时,self为nil。

    weak

    问题:对象相互引用,不能被释放,导致内存泄露。
    作用:弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为 nil。

    strong

    问题: block被执行时,对象为空。
    • 1.block被调用时,对象为空,
    • 2.block执行期间,对象被置为空
    作用:
    【针对问题1 】无能为力,需要自己排查处理。
    【针对问题2 】强引用,在block被调用时,对象的计数器加一。在block执行完毕后,计数器减一。

    总结:

    使用strong时,需要先判断对象是否为空。

    再来一段

    • 在单线程中,方法总是按照顺序依次执行,block方法与释放对象的方法都在同一线程中。
    • 若在block之前,执行释放对象的方法,当block被执行时,对象为空。
    • 若在执行block时,对象不为空,则整个block函数执行期间,对象都不会为空,因为block执行时,线程是不会执行其他方法调用的,也就是不会调用到释放对象的方法。
    • 若在block方法之后,执行释放对象的方法,此时对block不会产生任何影响。

    所以,在单线程中,没有必在block中使用strong。

    M1:block方法
    M2:释放对象方法

    • 在多线程中,M1,M2两个方法可同时在T1,T2两个线程中调用。
    • 在T1线程调用M1时,对象为被释放。
    • 在M1方法执行过程中,T2执行了M2,执行完毕后,对象被释放。此时,M1中的对象指针为nil。

    所以,在多线程中,必须使用strong,使得在block执行过程中,对象的引用计数始终不为零。

    相关文章

      网友评论

          本文标题:iOS_循环引用的特殊案例:strong后,self为nil

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