今天碰到一群友问:为什么Block的循环引用 ,有时候需要处理有时候不需要处理?
个人认为Block之所以会造成循环引用的问题是
ViewController(self) 持有了block的对象 block中也持有当前的viewController 导致了循环引用。self对象将不会被销毁,从而block也不会被销毁,引起内存泄露。
解决方法:(1)从block方面处理
在block外部使用__week 或者__block来处理
(2)从ViewController方面处理 例如:
若在ViewController的viewDidLoad加入下方的代码,是不会导致循环引用的。因为代码块是类方法,ViewController没有持有该部分内存。当block执行结束后,block就会被释放掉,因而self就不会被持有。
[UIView animateWithDuration:0.5 animations:^{
[self testPrint];
}];
//内部@weakify @strongify(self);
@weakify(self);
[self.viewModel.updateContentSignal subscribeNext:^(id x) {
@strongify(self);
[self.tableView reloadData];
self.headerView.model = self.viewModel.featureModel;
}];
使用过RAC的同学应该都知道@weakify和@strongify,这两个宏在RAC中是已经定义好的,可以直接用,属于比较牛逼的写法。这两个宏一定成对出现,先@weakify再@strongify.可以很好的管理Block内部对self的引用。可以一步步点开发现其实使用到了C语言中的组合运算符。
网友评论