美文网首页
Block的底层实现(二):截获变量的Block

Block的底层实现(二):截获变量的Block

作者: 静谧的橘子 | 来源:发表于2017-10-25 08:52 被阅读1次

接着上一篇接下来,添加一下参数看看

int main(){
 int dmy = 256;
 int val = 10; 
 const char *fmt = "val = %d\n"; 
 void (^blk)(void) = ^{ printf(fmt,val); }; 
 val = 2;
 fmt = "These value were changed. val = %d\n";
 blk();
 return 0;
}

通过之前的clang命令编译一下,得到以下的代码


屏幕快照 2017-08-25 下午10.20.03.png

屏幕快照 2017-08-25 下午10.20.03.png

首先看一下相同的部分,从上面可以看出来__main_block_desc_0和__block_impl是相同,然后看一下不同的地方__main_block_impl_0的声明以及初始化;声明部分可以看到,之前使用的自动变量通过block语法作为成员变量追加到__main_block_impl_0结构体中,__main_block_impl_0结构体的成员变量类型的声明与自动变量的类型完全相同。注意,Block语法表达式中没有用到的自动变量不会被追加。下面是初始化该结构体实例的构造函数的差异:

__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, const char *_fmt, int _val, int flags=0) : fmt(_fmt), val(_val)

在初始化结构体实例时,根据传递给构造函数的参数对由自动变量追加的成员变量进行初始化。接下里时使用Block的匿名函数的实现。

static void __main_block_func_0(struct __main_block_impl_0 *__cself) { const char *fmt = __cself->fmt; // bound by copy int val = __cself->val; // bound by copy printf(fmt,val); }

之前声明定义的__main_block_impl_0结构体实例的成员变量的自动变量被使用到了Block语法表达式中。总的来说,截获到的自动变量作为成员变量被追加到__main_block_impl_0结构体中,在Block语法表达式执行时,再赋值给与之前相同表达式的自动变量。

相关文章

  • Block

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

  • Block的底层实现(二):截获变量的Block

    接着上一篇接下来,添加一下参数看看 通过之前的clang命令编译一下,得到以下的代码 屏幕快照 2017-08-2...

  • Block的底层实现(二):截获变量的Block

    接着上一篇接下来,添加一下参数看看 通过之前的clang命令编译一下,得到以下的代码 首先看一下相同的部分,从上面...

  • Block(匿名函数)

    一、语法格式 二、截获自动变量值和__block修饰符 block的自动变量截获只针对block中使用的自动变量。...

  • 2022-04-13 block笔记

    什么是block 什么是block调用 block截获变量 __block修饰符用在什么场景,__block变量_...

  • Block的底层实现(一):无截获变量Block

    Blocks用一句话概括就是带有自动变量的匿名函数. 首先先创建一个简单的无参数无返回值的block。 int m...

  • Block的底层实现(一):无截获变量Block

    Blocks用一句话概括就是带有自动变量的匿名函数.首先先创建一个简单的无参数无返回值的block。 在main函...

  • iOS面试之Block大全

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

  • iOS面试之Block模块

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

  • iOS block详细知识点

    Block与外界变量 1、截获自动变量(局部变量)值 (1)默认情况 对于 block 外的变量引用,block ...

网友评论

      本文标题:Block的底层实现(二):截获变量的Block

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