美文网首页
OC中的Block(一)

OC中的Block(一)

作者: aaayia | 来源:发表于2018-11-26 19:41 被阅读6次

Block的本质

block本质上也是一个OC对象,它内部也有个isa指针

void (^block)(void) = ^{
    NSLog(@"I am a block");
  };

block();

以上OC代码生成的C++代码为:

//block的定义声明
 void (*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
//block的调用
((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);

其中的生成的C++结构体分别是:

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;
    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) {

    NSLog(...);
}
  • block最后生成的是结构体__main_block_impl_0,
  • block是封装了函数调用以及函数调用环境的OC对象
  • 底层结构如下图所示:
Blcok_Layout 备注
(void *) isa isa指针
(int) flags
int Reserved
void *FuncPtr 函数地址
struct __main_block_desc_0* Desc block对象信息
__main_block_desc_0 备注
reserved
Block_size block结构体大小

相关文章

  • swift 调用 OC中的block

    OC中声明block; OC中实现block swift中实现

  • iOS原生&JS交互

    OC 获取js中的key OC调用js方法 JS调用OC中不带参数的block JS调用OC中带参数的block ...

  • Swift之闭包

    前言 闭包类似于OC的block,但是比OC的block应用面更广 在OC中block是匿名函数 在swift中函...

  • Swift 之闭包

    闭包 闭包类似于 OC 的 block,但是比 OC 的 block 应用面更广 在 OC 中 block 是匿名...

  • iOS Block本质笔记

    OC中定义block block访问外部参数 OC转C++分析 block的变量捕获机制 为了保证block能够正...

  • 深入 Block

    Block 前言 Block是OC中对C语言的扩展功能,是一种带有自动变量的匿名函数,Block在OC中的实现,点...

  • swift基础语法(十三)——闭包

    介绍 闭包和OC中的block非常相似OC中的block是匿名的函数Swift中的闭包是一个特殊的函数block和...

  • OC中block底层原理总结(下)

    关于OC中block的本质结构、block的变量捕获方式请查看OC中block底层原理总结(上)需要先看懂上篇文章...

  • iOS block和闭包

    OC中称Block swift中称闭包 其实是同一种东西 block是OC中对闭包的实现. 什么是block或者闭...

  • swift 闭包(类似OC中block)

    swift中的闭包 类似OC中block OC中block 回顾创建个HttpTool类.h .m 控制器中 sw...

网友评论

      本文标题:OC中的Block(一)

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