什么是Block?
|
|
MCBlock类中有这么一段代码,通过指令
|
|
得到一个转换后的.cpp文件源代码,上万行代码,我们要看的是下面这些代码
|
|
源码解析
block实际的结构体部分
|
|
impl和Desc也是两个结构体,而_ main block_ imp_0就是该结构体的构造函数,用来初始化
第一个成员变量impl
|
|
isa 指针,这个很熟悉吧,这就能看出block其实就是对象.
flags和reserved这两个基本就是一些标记,不需要去了解
FuncPtr这个就是函数指针,也就是block所需要执行的代码段,真正存的地址
第二个成员变量 Desc
|
|
reserve和Block_size分别代表了版本升级所需的区域和Block的大小
第三个结构体的构造函数
|
|
Main函数中调用的基本转换
|
|
分开倆步来看就是这样
|
|
细看下初始化函数内部的实现 _ block main_ impl_0
|
|
第一个参数是由Block块语法转换的正真内部函数指针,第二个参数就是作为静态全局变量初始化__main_block_desc_0的结构体实例指针,初始化如下
|
|
最终,初始化内部进行赋值
|
|
block()调用的内部实现
|
|
去掉类型就是
(*block->imp.FuncPtr)(block);
|
|
最后就是直接调用函数指针进行最终的调用,由上面所描述的,FuncPtr就是由__main_block_func_0的函数指针所赋值的指针,而且可以看出,这个函数的参数正是指向block本身结构体实例,block作为参数进行了传递
总结
__main_block_impl_0这个就是Block内部的结构体(该结构体成员有impl,Desc 和一个该结构体的初始化函数)
Block块内的代码转换成了main_block_func_0的c语言函数(参数就是main_block_impl_0结构体)
Block语法的初始化实际就是将__main_blcok_impl_0的结构体实例化,重点是Block的代码块{}通过转换成C的函数指针进行结构体的成员变量FuncPtr指针赋值
Block调用就是通过实例化的结构体里面的FuncPtr指针就行函数调用,而且参数就是该结构体本身