一、使用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);
}];
}
网友评论