美文网首页
iOS底层 -- Blcok本质

iOS底层 -- Blcok本质

作者: happy神悦 | 来源:发表于2020-09-08 02:29 被阅读0次

一、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这个函数。

相关文章

网友评论

      本文标题:iOS底层 -- Blcok本质

      本文链接:https://www.haomeiwen.com/subject/xlukektx.html