写点什么

Block 的底层实现

作者:NewBoy
  • 2022 年 7 月 16 日
  • 本文字数:1231 字

    阅读完需:约 4 分钟

Block 的底层实现

  • 原文件:


    int main(int argc, const char * argv[]) {        ^{ };        return 0;    }
复制代码


  • 通过 clang 命令将 OC 转为 C++代码来查看一下 Block 底层实现,clang 命令使用方式为终端使用 cd 定位到 main.m 文件所在文件夹,然后利用 clang -rewrite-objc main.m 将 OC 转为 C++,成功后在 main.m 同目录下会生成一个 main.cpp 文件


    struct __block_impl {        void *isa; //isa,指向所属类的指针,也就是block的类型        int Flags; //flags,标志变量,在实现block的内部操作时会用到        int Reserved; //Reserved,保留变量        void *FuncPtr; //block执行时调用的函数指针    };
struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) { impl.isa = &_NSConcreteStackBlock; //__main_block_impl_0的isa指针指向了_NSConcreteStackBlock impl.Flags = flags; impl.FuncPtr = fp; //从main函数中看, __main_block_impl_0的FuncPtr指向了函数__main_block_func_0 Desc = desc; //__main_block_impl_0的Desc也指向了定义__main_block_desc_0时就创建的__main_block_desc_0_DATA,其中纪录了block结构体大小等信息。 } };
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
}
static struct __main_block_desc_0 { size_t reserved; //保留字段 size_t Block_size; //block大小(sizeof(struct __main_block_impl_0)) } __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)}; //以上代码在定义__main_block_desc_0结构体时,同时创建了__main_block_desc_0_DATA,并给它赋值,以供在main函数中对__main_block_impl_0进行初始化。
int main(int argc, const char * argv[]) {
((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
return 0; }
复制代码


  • __block_impl结构体,它包含了 isa指针(包含 isa 指针的皆为对象),也就是说 block也是一个对象

  • __main_block_impl_0结构体,可以看出是根据所在函数(main 函数)以及出现序列(第 0 个)进行命名的,如果是全局的 blcok,就根据变量名和出现序列进行命名

  • __main_block_impl_0中包含了俩个成员变量和一个构造函数,成员变量分别是__block_impl结构体和描述信息Desc,之后在构造函数中初始化block的类型信息和函数指针等信息

  • __main_block_func_0函数,其实对应的block的函数体,该函数接受了一个__cself参数,其实就是对应的block本身

  • __main_block_desc_0 结构体,其中比较有价值的信息是block的大小

  • main函数对block的创建,可以看出执行block就是调用一个以block自身为参数的函数,这个函数对应着block的执行体


发布于: 2022 年 07 月 16 日阅读数: 47
用户头像

NewBoy

关注

虽不年少,艳阳高照 2019.04.10 加入

还未添加个人简介

评论

发布
暂无评论
Block的底层实现_ios_NewBoy_InfoQ写作社区