block传值

1.block传值回来

//block 第一步,id为返回类型,无则为void
@property (nonatomic ,copy)id(^titleblock)();

//block 第二步,在哪里调用block
if (_titleblock) {
   titleLabel.text = _titleblock();
}

//block 第三步,调用具体方法
CellViewController *cellCtrl = [[CellViewController alloc]init];
    NSInteger i = indexPath.row;
    NSDictionary *dict = dataManager.taskArray[i];
cellCtrl.titleblock = ^id(){

     return [dict objectForKey:@"title"];
};

2.block传值过去

//block 第一步,NSString *str为参数
@property (nonatomic ,copy)void(^block)(NSString *str);

//block 第二步,在哪里调用block
if (_block) {
    _block(symbol.data);
}

//block 第三步,调用具体方法
CellViewController *cellCtrl = [[CellViewController alloc]init];
    NSInteger i = indexPath.row;
    NSDictionary *dict = dataManager.taskArray[i];
cellCtrl.titleblock = ^(NSString *str){
        firstVC.label .text = str;
};
注意⚠️!!!

1.想要block判空时不为NULL,block必须先调用,即在第三步时,block的实现方法要先于跳转页面(跳转到block所在的页面)的方法运行,才能保证block是在同一个ViewController内的值

2.block中要用到self时需要注意
Apple 官方的建议是,传进 Block 之前,把 ‘self’ 转换成 weak automatic 的变量,这样在 Block 中就不会出现对 self 的强引用。如果在 Block 执行完成之前,self 被释放了,weakSelf 也会变为 nil
如下:

    __weak typeof(self) weakSelf = self;
    scanner.block = ^(NSString *str){

        DIDStr = str;
        [weakSelf.LocalSDKWebView reload];

    };

也可以把方法引到外面写,如下:

    __weak typeof(self) weakSelf = self;
    scanner.block = ^(NSString *str){
        __strong __typeof(self) strongSelf = weakSelf;
        [strongSelf did:str];
        [strongSelf did1];

    };
- (void)did:(NSString *)str {    
}
- (void)did1 {    
}

在 did:str 中,weakSelf 不会变成 nil,不过在 did:str 执行完成,调用第二个方法 did1 的时候,weakSelf 有可能被释放,于是,strongSelf 就派上用场了:
__strong 确保在 Block 内,strongSelf 不会被释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值