찾다

 >  Q&A  >  본문

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

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

[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呢

高洛峰高洛峰2757일 전654

모든 응답(1)나는 대답할 것이다

  • 我想大声告诉你

    我想大声告诉你2017-05-02 09:32:40

    블록이 반드시 순환 참조를 유발한다는 것은 사실이 아닙니다. 순환 참조인지 여부는 서로 강한 참조를 유지하는지 여부에 따라 다릅니다. self가 블록에 사용되면 블록은 self에 대한 참조를 유지하지만 self는 블록을 직접적 또는 간접적으로 유지하지 않으므로 순환 참조가 발생하지 않습니다.

    당신의 이해가 정확합니다.

    회신하다
    0
  • 취소회신하다