美文网首页
除 weak strong dance 之外的两种打破 bloc

除 weak strong dance 之外的两种打破 bloc

作者: 无夜之星辰 | 来源:发表于2019-05-23 09:45 被阅读0次

1.使用__block对象指向self:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    // self -> block -> vc -> self
    // 主动在vc那里断开
    __block SecondViewController *vc = self;
    self.block = ^{
        vc.view.backgroundColor = [UIColor redColor];
        vc = nil;
    };
    // block必须调用,否则依旧是循环引用
    self.block();
}

引用关系是:self -> block -> vc -> self.
通过主动将vc置为nil的方式打破这个引用环,需要注意的是block必须调用,不然引用环依旧是封闭的。

2.将self作为参数传递给block:

@property (nonatomic, copy) void(^block)(ViewController *vc);

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.block = ^(SecondViewController *vc) {
        vc.view.backgroundColor = [UIColor redColor];
    };
    self.block(self);
}

参数对函数体没有引用关系,所以这里的引用关系是:self -> block -> vc。


从上面的例子可以看出,两种方式都比较蛋疼,就像是拙劣的表演,不像weak strong dance那么直接,这也是weak strong dance才是主流方式的原因。

相关文章

网友评论

      本文标题:除 weak strong dance 之外的两种打破 bloc

      本文链接:https://www.haomeiwen.com/subject/isnmzqtx.html