编程开发

__weak,__block ,循环引用大概说

2017-12-12  本文已影响4人  cyhai

在使用block的时候,处理不当容易出现循环引用问题,或者对象过前释放的一些问题。
__weak的使用情况,__weak typeof(self) weakSelf = self;
如果定义了block属性,那么这个block就是self持有对象。但是block属性里面引用到self,则会出现相互持有,出现循环引用。直接用self有警告提示。
typedef void(^proBlock)(NSString * str);
@property (nonatomic , copy) proBlock block01;
//需要解除循环引用

    self.block01 = ^(NSString *str) {
        NSLog(@"%@",weakSelf.selfStr);
    };

__block的使用情况,__block相当于给一个外部变量去访问block内部的权限。

BlockFunVc * bfv = [BlockFunVc new];
    __block NSString * blockStr = @"";
    [bfv blockFunVcWithBlock:^(NSString *str) {
        blockStr = str;
    }];

如果我不使用__block,那么blockStr是无法访问block,也就无法拿到str。
不需要弱引用的情况。一般来说UIView动画中使用的Block是不需要使用__weak,不持有该函数,用也是不需要,应该说只要不是相互持有对象,就不需要会准确点。

//TODO:函数
//====testV函数
- (void)blockFun:(void (^)(NSString *))block
{
    self.proBlock02 = block;
}

//=======本身函数
- (void)testFun01
{
    NSLog(@"调用的第一个");
}
//调用函数无需使用弱引用,self并未持有blockFun
    [testVc blockFun:^(NSString *str) {
        self.selfStr = str;
        NSLog(@"%@",self.selfStr);
        [self testFun01];

    }];
[UIView animateWithDuration:3 animations:^{
      self.view.frame = CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.height);
    } completion:^(BOOL finished) {
       
    }];

但当在block里面使用weakSelf多次调用的时候,可能会出现过早释放掉。这时候应该使用__strong

        __strong typeof(self) strongSelf = weakSelf;
        [strongSelf testFun01];
        [strongSelf testFun02];
    });
上一篇 下一篇

猜你喜欢

热点阅读