zoukankan      html  css  js  c++  java
  • BLOCK循环引用

    何时block才会循环引用

    -为什么Block会循环引用: 我们很多行为会导致Block的copy,而当Block被copy时,会对block中用到的对象产生强引用(ARC下)或者引用计数加一(MRC下)。 
    如下:

    @property(nonatomic, readwrite, copy) completionBlock completionBlock;
    
    //发生循环引用!怎么办?
    self.completionBlock = ^ {
            if (self.success) {
                self.success(self.responseData);
            }
        }
    };
    • 对象有一个Block属性,然而这个Block属性中又引用了对象的其他成员变量,那么就会对这个变量本身产生强应用,那么变量本身和他自己的Block属性就形成了循环引用。在ARC下需要修改成这样:
    @property(nonatomic, readwrite, copy) completionBlock completionBlock;
    
    //完美解决
    __weak typeof(self) weakSelf = self;
    self.completionBlock = ^ {
        if (weakSelf.success) {
            weakSelf.success(weakSelf.responseData);
        }
    };
    • 也就是生成一个对自身对象的弱引用,如果是倒霉催的项目还需要支持iOS4.3,就用__unsafe_unretained替代__weak。如果是non-ARC环境下就将__weak替换为__block即可。non-ARC情况下,__block变量的含义是在Block中引入一个新的结构体成员变量指向这个__block变量,那么__block typeof(self) weakSelf = self;就表示Block别再对self对象retain啦,这就打破了循环引用。
  • 相关阅读:
    linux下分析Java程序内存汇总
    Linux使用jstat命令查看jvm的GC情况
    linux的top命令参数详解
    项目中常用的19条MySQL优化
    MySQL:(一)
    MySQL:(二)
    微信公众号开发 (3) 菜单处理
    MyBatis项目实战 快速将MySQL转换成Oracle语句
    Spring Boot (5) 整合 RabbitMQ
    系统 (一) Windows10安装Ubuntu子系统
  • 原文地址:https://www.cnblogs.com/crash-wu/p/5162321.html
Copyright © 2011-2022 走看看