每一个BLOCK都会生成一个对应的最重要的关键结构体(包含全部信息)
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
int a;
__main_block_impl_0(void *fp, struct__main_block_desc_0 *desc, int _a, int flags=0) : a(_a) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
关键结构体命名规则:前部分是__所在内部方法名_block_impl_方法体内第几个block
如:__main_block_impl_0
main方法内的第1个block
类似第二个命名为__main_block_impl_1
关键结构体内部成员1__block_impl
block赋值左边的那个部分,类型是__block_impl,是一种结构体,
void (*myBlock)() = … ,其中myBlock就是__block_impl类型,后期我们需要使用它来调用右边赋值的block.如myBlock(); 先有一个概念。
关键结构体内部成员2__main_block_desc_0
对结构体自身的描述,一个字段保留使用,一个字段保存结构体所占的size大小。
关键结构体引用参数成员
若干,就是引用外部的数据,如:int a
关键结构体构造函数__main_block_impl_0
结构体的构造函数
关键结构体构造函数参数1:void *fp 函数指针
传入:__main_block_func_0
bloc体内部实现方法,就是把你的block右边赋值的块里面的方法,拷贝过来,用C++实现了。
实际传入的是(void *)__main_block_func_0
如下:
static void __main_block_func_0 (struct __main_block_impl_0 *__cself) {
int a =__cself->a; // bound by copy
printf("a is %d\n",a);
}
关键结构体构造函数参数2&__main_block_desc_0_DATA
对__main_block_impl_0结构体的描述,实际传入的是
__main_block_desc_1_DATA
如下:
static struct __main_block_desc_1 {
size_t reserved;
size_tBlock_size;
}__main_block_desc_1_DATA={0,sizeof(struct__main_block_impl_1)};
关键结构体构造函数参数3: int _a
引用外部参数成员
关键结构体构造函数参数 4: int flags=0
系统保留标志位
关键结构体构造函数内部实现:
impl.isa = &_NSConcreteStackBlock; //标记为BLOCK类型
impl.Flags = flags;//保存标志位
impl.FuncPtr = fp;//保存函数指针
Desc = desc;//保存结构体描述
现在重点来了:impl 是什么东西。
刚才我们说要有一个概念,就是就是它是block赋值左边的那个部分。它保存关键结构体构造参数的所有内容,方便后期调用。
Impl 的类型定义:
非常简单,专门为了保存关键结构体构造函数成员设定的
struct __block_impl {
void *isa; //类型指针
int Flags; //标志位
int Reserved;//保留字段
void *FuncPtr;//函数指针
};
然后是怎么使用它的呢?
myBlock();
这个的底层实现如下:
主要是使用__block_impl的函数指针调用__block_impl自己
((void(*)(__block_impl*))((__block_impl*)block)->FuncPtr)((__block_impl *)myBlock);
这个函数指针对应的内容就是__main_block_func_0,通过__main_block_func_0实现了对block的真正的调用
最后是一个大集合:
void (*myBlock)() = ((void(*)())&__main_block_impl_0((void *)__main_block_func_0,&__main_block_desc_0_DATA, a));
关键结构体 构造函数 __main_block_impl_0 传入了3个参数,第三个参
数为引入的外部成员,然后赋值给block。