那为何能够修改他们呢?看下面的分析spa
clang 转换后的代码以下: 能够发现block结构体中没有增长a 和 b 变量, 也就是说转换后,对于全局变量 和 静态全局变量的访问方式和转换前彻底同样。指针
再看 静态局部变量c 是怎么转换的图片
将c的地址 传给了Block 构造方法作用域
对于静态局部变量,block的处理是:将静态局部变量的地址保存在block中,调用的时候,取出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超出变量做用域可存在的理由?
下一篇我会说明。