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啦,这就打破了循环引用。
  • 相关阅读:
    Design Tutorial: Inverse the Problem
    The Number Off of FFF
    "Money, Money, Money"
    No Pain No Game
    Group
    Vases and Flowers
    Codeforces Round #466 (Div. 2)
    ST表
    Wildcard Matching
    HDOJ 3549 Dinitz
  • 原文地址:https://www.cnblogs.com/crash-wu/p/5162321.html
Copyright © 2011-2022 走看看