block是封装了函数调用以及函数调用环境的OC对象
以这个testBlock为例:
它的底层结构是一个结构体__main_block_impl_0,其中包含
- __block_impl结构体impl
- Desc:__main_block_desc_0结构体,存储block的描述信息
- int i:捕获的外部变量
- 同名的构造函数
其中__block_impl的底层结构为:
- isa指针,所以本质上block是一个OC对象
- Flags:按 bit 位表示一些 block 的附加信息,比如判断 block 类型、判断 block 引用计数、判断 block 是否需要执行辅助函数等
- reserved:保留字段
- FuncPtr:block执行体的函数指针
其中__main_block_desc_0的底层结构为:
- reserved:保留字段
- Block_size:block 的大小
整体上的关系如下: