美文网首页
iOS基础 Block解决循环引用

iOS基础 Block解决循环引用

作者: 我是卖报的小行家 | 来源:发表于2021-03-09 16:08 被阅读0次

block 循环引用
循环引用 A对象持有B,B又持有A,互相强引用

解决循环引用问题:ARC 和MRC

ARC:
解决之道:1、__weak, 2、__unsafe__unretained 3、__block
__weak:不会产生强引用,指向的对象销毁时,会自动将指针置为nil
__unsafe__unretained :不会产生强引用,不安全,指向的对象销毁时,指针存储的地址不变,(再使用时候会产生野指针)
所以__unsafe__unretained 可以解决循环引用问题,但是不常用

上代码(针对__block这种情况)

       __block MJPerson * p1 = [[MJPerson alloc]init];
        
        p1.age = 20;
        
        p1.block = ^{
            NSLog(@"p1.age = %d",p1.age);
            p1 = nil;
        };
        p1.block();

打印结果:
2021-03-09 15:25:09.661216+0800 DoBlock[95750:2534599] p1.age = 20
2021-03-09 15:25:09.661635+0800 DoBlock[95750:2534599] -[MJPerson dealloc]

原因分析:
对象持有block ,
block里面持有__block变量(bryef)
__block变量里面有对象。如下图

断掉__block变量里面与对象的连接关系也就是上述代码的p1 = nil。这个时候连接就断开啦如下图

而且在使用__block解决时候必须再次调用block,不然不会起作用,

所以总上,解决循环引用最好的方法就是__weak

MRC:
首先明确一点,MRC不支持__weak的
所以解决方法

1、__unsafe__unretained 2、__block

相关文章

网友评论

      本文标题:iOS基础 Block解决循环引用

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