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

大家讲道理
大家讲道理

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

membalas semua(2)
Ty80

Sama ada ia akan menyebabkan rujukan bulat, anda hanya perlu menyemak sama ada blok itu disalin di dalam fungsi
Seperti Mansonry

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

Jika tiada salinan dan ia dikeluarkan selepas digunakan, ia tidak akan menyebabkan rujukan pekeliling.

黄舟

Bukankah ia menjadi amaran apabila terdapat kemungkinan rujukan pekeliling?
Ubah seperti ini

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

Rujukan pekeliling boleh dielakkan. Jangan tanya saya mengapa, saya tidak begitu faham, cuma semua orang menulisnya seperti ini.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan