美文网首页
OC中的block

OC中的block

作者: 绍清_shao | 来源:发表于2020-04-30 16:17 被阅读0次

Block

简单的block

 int main() {
 
    void (^blk)(void) = ^{printf("Block\n");};
    blk();
    return 0;
 
 }

会被编译器编译成下面那样

// 编译器编译后  准备工作
 // 生成一个block结构体,本身信息和捕获的变量
 struct _main_block_desc_0 {
     uintptr_t reserved;
     uintptr_t size;
 };
  
 struct _block_impl {
     void *isa;    &_NSComcreteStackBlock 三类
     int flags; // contains ref count
     int reserved;
     void *FuncPtr;
 };
 
 struct _main_block_impl_0 {
    struct _block_impl impl;//存储block基本信息和闭包函数指针
    struct Block_descriptor_1 *descriptor; //存储block大小
    // 捕获的参数
    ...
    ...
 }
 
 // 初始化 Block 描述结构体_main_block_desc_0,得到block大小
 static _main_block_desc_0_DATA = _main_block_desc_0{0,sizef(_main_block_impl_0) }
 // block内实现被编译器转换成函数,参数是block结构体
 static void _main_block_func_0(struct _main_block_impl_0 *_cself){
    Block内实现
 }
 
 // 正式开始
 int main() {
    // 局部指针变量,指向 _main_block_impl_0结构体。 传入准备好的描述和实现
    // _main_block_impl_0结构体实例的指针赋给变量blk。该源代码中的Block就是_main_block_impl_0
    // 结构体类型的自动变量,即栈上生成的_main_block_impl_0结构体实例
    blk = _main_block_impl_0(_main_block_func_0, &_main_block_desc_0_DATA)
    // 执行
    (*blk->impl.FuncPtr)(blk)
    
    return 0;
 }

block即对象

Block编译后可以看到是由C语言的结构体实现的,Blcok的实现跟OC中对象的实现是类似的。在OC中,凡是第一地址是isa指针都被认为是对象,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能够正...

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

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

  • swift 闭包(类似OC中block)

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

  • 深入 Block

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

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

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

  • Swift 闭包(二)

    OC Block 和 Swift 闭包相互调用 我们在 OC 中定义的 Block,在 Swift 中是如何调用的...

网友评论

      本文标题:OC中的block

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