美文网首页编程开发
__weak,__block ,循环引用大概说

__weak,__block ,循环引用大概说

作者: cyhai | 来源:发表于2017-12-12 17:29 被阅读4次

    在使用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];
        });
    

    相关文章

      网友评论

        本文标题:__weak,__block ,循环引用大概说

        本文链接:https://www.haomeiwen.com/subject/mrunixtx.html