Block

作者: 初灬终 | 来源:发表于2019-10-17 21:16 被阅读0次

Block是一个对象,它封装了block的函数和函数执行上下文。

void testBlock() {
    
    int num = 3;
    void(^block)(int) = ^(int i){
        NSLog(@"%d", i * num);
    };
    block(2);
}

clang -rewrite-objc main.m 查看main.cpp

void testBlock() {

    int num = 3;
    void(*block)(int) = ((void (*)(int))&__testBlock_block_impl_0((void *)__testBlock_block_func_0, 
                          &__testBlock_block_desc_0_DATA, num));
    ((void (*)(__block_impl *, int))((__block_impl *)block)->FuncPtr)((__block_impl *)block, 2);
}
block封装而成的结构体

结构体__testBlock_block_impl_0的构造方法内有isa指针,也可以说block最后封装成了一个对象。

struct __testBlock_block_impl_0 {
  struct __block_impl impl;
  struct __testBlock_block_desc_0* Desc;
  int num;
  // 构造函数。fp表示方法指针,指向__testBlock_block_func_0。
  __testBlock_block_impl_0(void *fp, struct __testBlock_block_desc_0 *desc, int _num, int flags=0) : num(_num) {
    //block的类型。NSConcreteGlobalBlock,NSConcreteStackBlock,NSConcreteMallocBlock
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};
block内容封装而成的函数
static void __testBlock_block_func_0(struct __testBlock_block_impl_0 *__cself, int i) {
  int num = __cself->num; // bound by copy
  NSLog((NSString *)&__NSConstantStringImpl__var_folders_8q_dqmgnrnj4g3cmnwws_kp_8sr0000gn_T_main_b72911_mi_0, i * num);
}
block的描述
static struct __testBlock_block_desc_0 {
  size_t reserved;
  size_t Block_size;
} __testBlock_block_desc_0_DATA = { 0, sizeof(struct __testBlock_block_impl_0)};

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

      本文标题:Block

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