Block循环引用进行弱处理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值