搜尋

首頁  >  問答  >  主體

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没有导致循环引用

大家讲道理大家讲道理2838 天前902

全部回覆(2)我來回復

  • PHP中文网

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

    是否會引起循環引用你只要看函數內部是否copy了這個block就知道了.
    像Mansonry

    • (NSArray )mas_makeConstraints:(void(^)(MASConstraintMaker ))block {
      self.translatesAutoresizingMaskIntoConstraints = NOd
      self.translatesAutoresizingMaskIntoConstraints = NO;
      MASMlocaker;
      block(constraintMaker);
      return [constraintMaker install];

      }

    沒有cop​​y 使用完就釋放了 是不會造成循環引用的.🎜

    回覆
    0
  • 黄舟

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

    當有可能出現循環引用的時候不是會warnning麼。
    這麼改

        __weak id weakSelf = self;
        [testButton bk_addEventHandler:^(id sender) {
            __strong <#你的VC类#> strongSelf = weakSelf;
            [strongSelf dismissViewControllerAnimated:YES completion:nil];
        } forControlEvents:UIControlEventTouchUpInside];

    可以避免循環引用。不要問我為什麼,我也不太明白,只是大家都這麼寫。

    回覆
    0
  • 取消回覆