美文网首页
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