深入探讨BLOCK关键结构体

每一个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

结构体的构造函数

关键结构体构造函数参数1void *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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值