为什么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

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容