Block中的循环引用问题
由于我们很多行为会导致Block的copy,而当Block被copy时,会对block中用到的对象产生强引用(ARC下)或者引用计数加一(non-ARC下)。
如果遇到这种情况:
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片 %zd",indexPath.row);
if (indexPath.row > 5) {
[NSThread sleepForTimeInterval:2];
}// 加载图片
NSURL *url = [NSURL URLWithString:app.icon];
// 接收二进制数据
NSData *data = [NSData dataWithContentsOfURL:url];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 图片下载完成了
// 清除下载操作
[self.operationCache removeObjectForKey:app.icon];
UIImage *image = [UIImage imageWithData:data];
// 转成图片
// cell.iconView.image = image;
// 把图片保存到模型中去
app.image = image;
// 下载完图片,不需要直接设置image. reloadData
// 去除了image跟cell 的关系
[Self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}];
// NSLog(@"%@",data);
}];
对象有一个Block属性,然而这个Block属性中又引用了对象的其他成员变量,那么就会对这个变量本身产生强应用,那么变量本身和他自己的Block属性就形成了循环引用。在使用block前增加一句对self弱引用(以下),再讲block里的self全替换成weakSelf,也可以对self对象进行retain掉
__weak typeof(self) weakSelf = self;
记得包工头的教训:
使用block
要注意了!~
循环引用
block
中使用属性 -> self.
属性名,
只要block
中出现 self
就应该检查