前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >block-捕获变量

block-捕获变量

作者头像
大壮
发布2020-04-10 15:59:04
4370
发布2020-04-10 15:59:04
举报
文章被收录于专栏:大壮大壮

说到变量,在OC中分为以下几种变量。block在捕获不同类型变量时内部的逻辑并不相同。

  • 自动变量(局部变量)
  • 函数参数
  • 静态变量
  • 静态全局变量
  • 全局变量 总体可以分为2类
  • 自动变量,函数参数
  • 静态变量,静态全局变量,全局变量

一.blcok捕获局部变量

代码语言:javascript
复制
    __block int value = 20;
    int value1 = 10;
    int (^getBlock)(int num) = ^(int num) {
        //100 + 30 + 10
        return num + value + value1;
    };
    value = 30;
    value1 = 40;
    NSLog(@"getBlock-%d",getBlock(100));

输入结果是 140, 这里会发现几个问题:

  • 如果不加__block 不可以修改value的值,为什么?
  • 无论加不加__block 都可以获取到value的值,为什么?
  • 为什么在block中,value的值变化了,value1的值没变化?

从block设计结构上理解。block是一个匿名的闭包函数。在2个函数方法中,在block的函数方法中,一定是不能直接获取到外部函数的值。

  1. 如果不写__block: 为了让block内部访问到外部的局部变量。在执行block语法的时候,block语法表达式所使用的局部变量的值是被保存进了block的结构体实例中,也就是block自身中。 但是block仅仅捕获了val的值,并没有捕获val的地址。所以你只能获取到value的值。并不能修改value的值。</u>并且从设计结构上,在编译的层面就防止开发者可能犯的错误。

完整版本请看 https://xiaozhuanlan.com/topic/4196075238

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.blcok捕获局部变量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档