当前位置:   article > 正文

iOS开发——Block循环引用问题的解决_ios block后再引用值为空

ios block后再引用值为空

下面的代码存在循环引用问题:

  1. @property(nonatomic, readwrite, copy) CompletionBlock completionBlock;
  2. //……
  3. self.completionBlock = ^ {
  4. if (self.success) {
  5. self.success(self.responseData);
  6. }
  7. }
  8. };

原因是:

对象拥有一个block属性,而block属性又引用了对象的其他成员变量,这就导致对其他成员变量产生了强引用,使得对象和它的block属性之间形成了循环引用。

在ARC下需要改成这样:

  1. @property(nonatomic, readwrite, copy) completionBlock completionBlock;
  2. //……
  3. __weak typeof(self) weakSelf = self;//生成一个对自身对象的弱引用
  4. self.completionBlock = ^ {
  5. if (weakSelf.success) {
  6. weakSelf.success(weakSelf.responseData);
  7. }
  8. };

如果是non-ARC环境下就将__weak替换为__block即可。non-ARC情况下,__block变量的含义是在Block中引入一个新的结构体成员变量指向这个__block变量,那么就表示Block别再对self对象retain啦,这就打破了循环引用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/898681
推荐阅读
  

闽ICP备14008679号