在MRC情况下对block外的对象加上__block有两个作用:
- 说明变量可修改
- 说明指针指向的对象不做隐式的retain操作
在ARC情况下即便对对象加上了__block,因为__block只声明该对象可以修改,一个对block捕获的也是对象也是一个强引用,所以这时就要对对象手动释放,否则依旧会造成循环引用:
SeondViewController *__block ctl = [[SeondViewController alloc] init];
ctl.testBlock = ^{
[ctl sayHai];
ctl = nil;
};
[self.navigationController pushViewController:ctl animated:YES];
该方式的弊端是如果该block不调用,则依旧不会解除循环引用,这时__weak是个更优的选择:
SeondViewController * ctl = [[SeondViewController alloc] init];
SeondViewController * __weak weakCtl = ctl;
ctl.testBlock = ^{
[weakCtl sayHai];
};
[self.navigationController pushViewController:ctl animated:YES];