Block原理 - block是怎么修改外部变量的值

1.能够修改全局变量、静态全局变量、静态局部变量。

那为何能够修改他们呢?看下面的分析spa

 

clang 转换后的代码以下: 能够发现block结构体中没有增长a 和  b 变量, 也就是说转换后,对于全局变量 和 静态全局变量的访问方式和转换前彻底同样。指针

 

再看 静态局部变量c 是怎么转换的图片

将c的地址 传给了Block 构造方法作用域

对于静态局部变量,block的处理是:将静态局部变量的地址保存在block中,调用的时候,取出block中这个指针变量,从而获得静态变量的值,进行操做。变量

 

 

2.还能够使用    __block (存储域类说明符)

__block相似于static  auto  register 等说明符,做用是:将变量值设置到哪一个存储域中。方法

好比 auto  表示做为自动变量存储在栈中im

      static 表示做为静态变量存储在静态区static

 

__block 变量 转换后到底什么样的呢?img

能够看到变成了一个  __Block_byref_a_0 的结构体,这个结构体以下:(图片看不清能够放大)co

 

这个结构体自己中就有一个变量int a 来存储 咱们定义的__block int a 的值。

即:__block 将int a 变成了一个叫  __Block_byref_a_0 的结构体,而且结构体中存储这个这个a 的值。这个__block int a = 1;  就变成了一个结构体类型的局部变量,它存在栈区。

 

再看给__block int  a 赋值的代码

转换以下:

首先 Block  结构体 __main_block_impl_0 中持有 __block结构体 __Block_byref_a_0 *a

接着 __block结构体 __Block_byref_a_0 中的__forwaring 持有指向该实例自身的指针,经过成员变量__forwaring访问成员变量 a  ( a 是__Block_byref_a_0 实例自身持有的变量,保存了int a 的值)

 

 

有2个疑问:__forwaring存在的理由是什么?

                block超出变量做用域可存在的理由?

下一篇我会说明。

相关文章
相关标签/搜索