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才是主流方式的原因。
网友评论