OC之 block 本质
2016-01-07 00:00
302 查看
实现方式
数据结构定义
block 的数据结构定义如下(图片来自 这里):![](http://static.oschina.net/uploads/img/201601/07184527_zRQx.jpg)
对应的结构体定义如下:
struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void *dst, void *src); void (*dispose)(void *); }; struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor *descriptor; /* Imported variables. */}; | |
flags,用于按 bit 位表示一些 block 的附加信息,本文后面介绍 block copy 的实现代码可以看到对该变量的使用。
reserved,保留变量。
invoke,函数指针,指向具体的 block 实现的函数调用地址。
descriptor, 表示该 block 的附加描述信息,主要是 size 大小,以及 copy 和 dispose 函数的指针。
variables,capture 过来的变量,block 能够访问它外部的局部变量,就是因为将这些变量(或变量的地址)复制到了结构体中。
该数据结构和后面的 clang 分析出来的结构实际是一样的,不过仅是结构体的嵌套方式不一样。但这一点我一开始没有想明白,所以也给大家解释一下,如下 2 个结构体 SampleA 和 SampleB 在内存上是完全一样的,原因是结构体本身并不带有任何额外的附加信息。
struct SampleA { int a; int b; int c; }; struct SampleB { int a; struct Part1 { int b; }; struct Part2 { int c; }; }; |
_NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。
_NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。
_NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。
相关文章推荐
- Android屏幕自动变换,layout-land文件修改报错
- 天下数据浅谈服务器存储加速器四点独特应用
- 创业的第一百零三天
- CI学习一:maven项目自动部署到tomcat
- spring源码阅读笔记(二)——自定义标签
- ecshop,里的{$search_keywords|escape}在哪里设置
- ecshop广告调用
- iOS App设置icon,启动图,App名称的方法
- 多线程并发流程控制之dispatch_group 有关函数
- 跟着MJExtension实现简单的字典转模型框架 - 简书
- PCA的概念
- Windows系统下安装配置Nginx
- Thinkphp3.2.3 路由
- eclipse设置和优化
- js 中的继承
- 关于Spring4.0 MappingJackson2HttpMessageConverter
- springmvc提交带日期的表单400
- spring mvc 模型解析
- 触发器
- SQL Server 触发器