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啦,这就打破了循环引用。
  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/crash-wu/p/5162321.html
Copyright © 2011-2022 走看看