产生循环引用的原因
block任何时候都会强引用在block代码块内部的对象,block消失,则强引用消失,block一直留存,强引用一直在,所以问题的关键是block是否会消失,如果A对象直接或者间接强引用一个block,block正好又强引用对象,那么就产生的循环引用。
image.png
解决办法
- 释放block 或者
例如
masonry解决的办法是释放block
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);//给block加工一下 加工完 block就释放了
/**
constraintMaker.left....
constraintMaker.right...
*/
return [constraintMaker install];
}
- block不要强引用
这就是大家常用的weak self啦。
7-6补充
在block里使用对象,要不要弱化对象的依据是什么?
是block内部对象有没有对block有直接或者间接的强引用过,图中任意一种情况,需要对对象进行weak操作
剩余的情况无需进行weak操作
完。
网友评论