美文网首页iOS开发你需要知道的iOS 知识收集
iOS底层学习16 -- block循环引用问题

iOS底层学习16 -- block循环引用问题

作者: 恋空K | 来源:发表于2020-09-01 18:17 被阅读0次
    block属于要是copy修饰的,给这个block属性赋值的时候,会对右边的block会进行一次copy操作,copy到堆上去,当然如果block属性用strong修饰,也会将右边的block copy到堆上去的,强引用block,block也是会copy到堆上的,不过我们一般建议用copy修饰,这样不管是MRC还是ARC这个写法都是一致的
    其内存图如下


    这种写法等价于下面的写法


    _weak:不会产生强引用
    _unsafe_unretained:不会产生强引用,不安全
    如果是_weak修饰,当指向的对象销毁了,会自动把保存的地址值置为nil,而_unsafe_unretained修饰,指向的对象就算销毁了,也不会把保存的地址置为nil的。





    //MRC是不支持_weak的


    __weak typeof(self) weakSelf = self;
    self.someBlock = ^{
        __strong typeof(weakSelf) strongSelf = weakSelf;
        [self doSomething];
    }
    

    在block外部使用weakSelf定义self的弱引用对象,然后在block内部对weakSelf进行一次强引用(防止执行到block块中代码的时候self被提前释放导致weakSelf为nil),由于strongSelf定义为局部变量,当其作用域结束后,strongSelf自动释放对self的强引用,从而避免了retain cycle。







    person要是没有调用test方法,person是会正常释放的,要是person调用了test方法,不管有没有调用里面的block,person都不会正常释放,因为有循环引用
    对应上图

    相关文章

      网友评论

        本文标题:iOS底层学习16 -- block循环引用问题

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