OC对象 - Block的变量捕获

OC对象 - Block的变量捕获

为了保证block内部能够正常访问外部的变量,block有个变量捕获机制

1.auto类型的变量

我们在声明变量的时候,默认就是auto类型:int age = 10

  • 如下代码。变量age在调用block之前,我们给它赋值为20了,那么打印结果是什么呢
ini 复制代码
int age = 10;
void(^block)(void) = ^{
    printf("age is: %d\n", age);
};

age = 20;

block();

打印的是: 10

这是为什么?

1.1 查看底层代码

  • 此时struct __main_block_impl_0里面多了个age变量,并且初始化的时候,把 int age = 10作为参数传进去了
  • 那么是不是可以认为,block在初始化的时候,把 age 作为参数传进去并保存了

没错,对于auto变量,block 其实是使用值传递的方式来捕获变量

2.static类型的变量

我们在上面代码基础上,用static来修饰age变量

ini 复制代码
static int age = 10;
void(^block)(void) = ^{
    printf("age is: %d\n", age);
};

age = 20;

block();

会发现,此时打印的是 20

这又是为什么呢

2.1 查看底层代码

  • 细心的会发现,和前面的auto变量相比,static修饰的变量,在底层实现的时候,age成员多了*号,并且block初始化时传递的age,多了&符号。

所以,对于static修饰的变量,block 其实是使用指针传递的方式来捕获变量,block里面是通过 age 的指针来访问的,所以age = 20;后,block 再打印的就是修改过后的 age 了

3. 全局变量

既然是全局变量,相当于是任何作用域下都可以直接访问,所以block就没必要进行变量捕获

总结

@oubijiexi

相关推荐
工程师老罗12 分钟前
Ubuntu下怎么将u盘格式化为ext4?
linux·运维·ubuntu
study_小达人16 分钟前
ubuntu 22.04设置limit不生效
linux·运维·ubuntu
Johny_Zhao17 分钟前
黑客msfconsole渗透工具超详细使用说明
linux·python·网络安全·信息安全·渗透测试·云计算·系统运维·攻防演练
挨踢攻城26 分钟前
Linux 下合并多个 PDF 文件为一个 PDF 文件的方法
linux·前端·rhce·rhca·linux运维·红帽认证·公众号:厦门微思网络
liulilittle29 分钟前
XDP VNP虚拟以太网关(章节:二)
linux·服务器·网络·c++·通信·xdp
比奇堡派星星30 分钟前
Linux 平台设备驱动框架详解
linux·开发语言·驱动开发
代码游侠41 分钟前
应用——Linux Framebuffer 图形库显示
linux·运维·服务器·数据库·笔记·算法
会飞的小新43 分钟前
Linux PCI 设备查看工具 lspci 的工作机制与使用方法
linux
xingzhemengyou144 分钟前
LINUX modprobe 智能加载和卸载内核模块
linux·服务器·前端
xingzhemengyou11 小时前
Linux who指令查询和显示当前登录系统的用户信息
linux·服务器·网络