美文网首页
Block的循环引用的理解

Block的循环引用的理解

作者: CodingWord | 来源:发表于2017-02-21 16:57 被阅读0次

今天碰到一群友问:为什么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语言中的组合运算符。

相关文章

网友评论

      本文标题:Block的循环引用的理解

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