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
网友评论