Block循环引用进行弱处理

来源:互联网 发布:淘宝怎么看总销售额 编辑:程序博客网 时间:2024/05/16 14:00

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 就应该检查

0 0
原创粉丝点击