objective-c - 为什么iOS的Masonry中的self不会循环引用?
大家讲道理
大家讲道理 2017-04-17 17:26:06
0
2
898
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没有导致循环引用

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(2)
Ty80

Si cela provoquera une référence circulaire, il vous suffit de vérifier si le bloc est copié à l'intérieur de la fonction
Comme Mansonry

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

S'il n'y a pas de copie et qu'elle est publiée après utilisation, cela ne provoquera pas de référence circulaire.

黄舟

Ne serait-ce pas un avertissement lorsqu'il existe une possibilité de référence circulaire ?
Change comme ça

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

Les références circulaires peuvent être évitées. Ne me demandez pas pourquoi, je ne comprends pas très bien, c’est juste que tout le monde écrit comme ça.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal