一、Blcok底层的结构
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0 *Desc;
//构造函数,类似于OC的init方法
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
// block中要执行的代码
}
二、Blcok底层的结构之间对应关系

总结:
- 1.创建一个函数_main_block_func_0,这个函数的作用就是将我们block中要执行的代码封装到函数内部,方便调用。
- 2.创建一个结构体_main_block_desc_0,这个结构体中主要包含_main_block_impl_0这个结构体占用的存储空间大小等信息。
- 3.将1中创建的_main_block_func_0这个函数的地址,和2中创建_main_block_desc_0这个结构体的地址传给_main_block_impl_0的构造函数。
- 4.利用_main_block_func_0初始化_main_block_impl_0结构体的第一个成员变量impl的成员变量FuncPtr。这样_main_bck_impl_0这个结构体也就得到了block中那个代码块的地址。
- 5.利用_mian_block_desc_0_DATA去初始化_mian_block_impl_0的第二个成员变量Desc。
- 6.通过block->FuncPtr调用也就获取了_main_block_func_0这个函数的地址,然后对_main_block_func_0进行调用,也就是执行block中的代码了。这中间block又被当做参数传进了_main_block_func_0这个函数。
网友评论