Block如何使用weakself

一、使用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)