Block回调理解

 

block应用实例如下:https://blog.csdn.net/huangfei711/article/details/73928495

Block循环引用的问题:

bVC.callBackBlock = ^(NSString *text){
       NSLog(@"text is %@",text);     
       self.label.text = text;      
    };

代码 self.label.text = text; ,在 Block 中引用 self ,也就是 A ,而 A 创建并引用了 B ,而 B 引用 callBackBlock,此时就形成了一个循环引用,而编译器也不会报任何错误,此时使用弱引用解决这个问题。

- (IBAction)ABtn:(UIButton *)sender {
    __weak typeof(self) weakSelf = self;
    BViewController *BVC = [[BViewController alloc] init];
    BVC.backBlock = ^(NSString *text) {
        weakSelf.ATextLabel.text = text;
    };
    [self presentViewController:BVC animated:true completion:nil];
}

我们都知道 Block 能截取自动变量,并且是不能在 Block 块中进行修改的(除非用__block修饰符),但是很明显 weakSelf.label.text的值被修改了,并且没有用__block修饰符, 这是为什么呢?因为 label 是个全局变量,而如果像如下的局部变量 a 是不能修改的,编译器也会报错。

 

Block 为什么能实现神奇的回调

在这里我不会说什么实现原理,仅仅是个人对 Block 能实现神奇回调的理解,有错误的地方请大家指出。

在先前使用 Block 的过程中,虽然会使用,但是总是有一个疑惑,简单说来就是:

为什么在 A 中的 block 块能调用到 B 中的数据?

回顾一下我们在 B 中所实现的代码,不外乎定义了一个 Block 变量,并在适当的时候传入参数,那么为什么在调用了  self.callBackBlock(_textField.text) 之后,值就神奇传到了 A 中的 Block 块了呢?

通过整理使用的过程,我发现是我们的思维陷入了误区(可能是我个人),我们认为在 B 中传入 _textField.text 参数之后, A 中的 Block 块就可以获取到值。虽然思路是对的,但其实是不完整,导致我们形成了回调的数据是通过某种底层实现传递过去的错觉,这就使得我们认为这不需要深究。

事实是,通过简单的整理我们可以发现完整的回调流程应该是这样的:

  1. block 代码块赋值给 bVC.callBackBlock,此时 callBackBlock 的指针就指向这个代码块。
  2. 调用 callBackBlock(NSString *text)
  3. 由于 callBackBlock 的指针是指向 A 中的 block 代码块,因此执行代码块的代码,实现回调。

    很显然之前我忽略了代码块赋值给 callBackBlock 的这个操作(羞愧)。

    现在再通过一段代码可以更清晰地理解这个原理:

    bVC.callBackBlock = ^(NSString *text){ //1
            NSLog(@"text is %@",text);
        };
      bVC.callBackBlock = ^(NSString *text){ //2
            NSLog(@"text b is %@",text);
        };

    上述代码中,我们对 callBackBlock进行了两次赋值,结果会怎么样呢?可以看出来,Block 的回调只对代码 2 生效,因为callBackBlock的指针最后指向了代码 2 的代码块。所以并没有什么神奇的魔法,也没什么隐藏的底层机制(这里指的是方便理解的底层)让你可以带着疑惑去使用它。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值