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

2019-05-23  本文已影响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才是主流方式的原因。

上一篇 下一篇

猜你喜欢

热点阅读