美文网首页
Block如何使用weakself

Block如何使用weakself

作者: 海边漫步的我 | 来源:发表于2017-08-24 18:38 被阅读27次

    一、使用block会产生内存泄漏的情况

    1.block作为控制器的属性,没有用weakself弱化(self直接持有block)

    //self直接持有次block
     self.testBlock(self.tag);
    

    2.MJRefreshHeader 下拉刷新的block(self间接持有这个block)

    //下拉刷新 或者上拉刷新都需要弱化
        self.tableView.mj_header=[MJRefreshNormalHeader headerWithRefreshingBlock:^{
            [weakSelf dosomething];
        }];
    

    二、不会产生内存泄漏的情况

    1.常用的block

    //当前的self没有直接(或者间接)持有block
    1.[UIView animateWithDuration:0.1 animations:^{
            self.view.frame=CGRectMake(100, 100, 100, 100);
        }];
    2.[self.array enumerateObjectsUsingBlock:^(NSString *str, NSUInteger idx, BOOL * _Nonnull stop) {
            [self dosomething:str];
        }];
    3.GCD的block和AFNetworking的block 和上面相同,没有直接强引用block,不会产生内存泄漏
    但是,以下情况如果你弱化了
    __weak __typeof__(self) weakSelf = self;
    //在 doSomething 中,weakSelf 不会变成 nil,不过在 doSomething 执行完成后,调用第二个方法 doOtherThing 的时候,weakSelf 有可能被释放,于是,strongSelf 就派上用场了:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        __strong __typeof(self) strongSelf = weakSelf;
        [strongSelf doSomething]; //这是weak self被释放,必须用strongSelf
        [strongSelf doOtherThing];
    });
    

    2.直接使用block

    //直接使用block,没有作为self的属性
     TestBlock testBlock = ^()
      {
          NSLog(@"%@",self.view);
      };
    [self test:testBlock];
    

    3.作为参数传递数据的时候

     -(void)loadData{
       [self loadDataCompletion:^(Minemodel *mineModel){
           //刷新数据
    }];
    }
    -(void)loadDataCompletion:(void(^)(MineModel*mineModel))block{
     // 请求服务端数据
        NSString *getMineUrl = [NSString stringWithFormat:@"%@",mineurl];
        [HttpTool postWithUrl:getMineUrl params:pramaDic success:^(id json) {
            NSDictionary *dict = json;
            self.mineModel = [[MineModel alloc] init];
            [self.mineModel setValuesForKeysWithDictionary:dict];
            block(self.mineModel);
        
        } failure:^(NSError *error) {
            NSLog(@"错误%@",error.localizedDescription);
    
        }];
    }
    

    相关文章

      网友评论

          本文标题:Block如何使用weakself

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