찾다

 >  Q&A  >  본문

objective-c - 为什么iOS的Masonry中的self不会循环引用?

UIButton *testButton = [[UIButton alloc] init];
[self.view addSubview:testButton];
testButton.backgroundColor = [UIColor redColor];
[testButton mas_makeConstraints:^(MASConstraintMaker *make) {
    make.width.equalTo(@100);
    make.height.equalTo(@100);
    make.left.equalTo(self.view.mas_left);
    make.top.equalTo(self.view.mas_top);
}];
[testButton bk_addEventHandler:^(id sender) {
    [self dismissViewControllerAnimated:YES completion:nil];
} forControlEvents:UIControlEventTouchUpInside];

如果我用blocksKit的bk_addEventHandler方法, 其中使用strong self, 该viewController就无法dealloc, 我理解是因为,self retain self.view, retain testButton, retain self.
但是如果只用Mansonry的mas_makeConstraints方法, 同样使用strong self, 该viewController却能正常dealloc, 请问这是为什么, 为什么Masonry没有导致循环引用

大家讲道理大家讲道理2772일 전844

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

  • PHP中文网

    PHP中文网2017-04-17 17:28:06

    순환 참조가 발생하는지 여부는
    Mansonry처럼

    함수 내부에서 블록이 복사되는지 확인하면 됩니다.
    • (NSArray )mas_makeConstraints:(void(^)(MASConstraintMaker ))block {
      self.translatesAutoresizingMaskIntoConstraints = NO;
      MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
      block(constraintMaker);
      return [constraintMaker install];
      }

    카피가 없고 사용 후 공개하면 순환 참조가 발생하지 않습니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 17:28:06

    순환참조 가능성이 있으면 경고가 되지 않을까요?
    이렇게 바꿔보세요

    으아아아

    순환 참조는 피할 수 있습니다. 왜냐고 묻지 마세요. 잘 이해가 안 돼요. 그냥 다들 이렇게 쓰는 거에요.

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