为什么masonry自带的blcok无需害怕循环引用?

产生循环引用的原因

  • 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操作

image.png

剩余的情况无需进行weak操作

image.png

完。

你可能感兴趣的:(为什么masonry自带的blcok无需害怕循环引用?)