objective-c - 关于Masonry为什么不会造成循环引用的问题

浏览:40日期:2023-11-24

问题描述

代码举个例子,我不知道自己的理解对不对。

[self.view mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.otherView.mas_centerY);}];

block中持有了self,但是self.view并没有持有这个block,因为看到Masonry的源码是这样的:

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block { self.translatesAutoresizingMaskIntoConstraints = NO; MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self]; block(constraintMaker); return [constraintMaker install];}

它仅仅是block(constrainMaker)。如果改成了self.block = block(constrainMaker),那么view是不是也持有了block呢

问题解答

回答1:

并不是 block 就一定会造成循环引用,是不是循环引用要看是不是相互持有强引用。block 里用到了 self,那 block 会保持一个 self 的引用,但是 self 并没有直接或者间接持有 block,所以不会造成循环引用。

你的理解是对的。

相关文章: