研究Block
的捕获外部变量就要除去函数参数这一项,下面一一根据这4种变量类型的捕获情况进行分析。
- 自动变量
- 静态变量
- 静态全局变量
- 全局变量
首先 全局变量global_i
和 静态全局变量static_global_j
的值增加,以及它们被Block
捕获进去,这一点很好理解,因为是全局的,作用域很广,所以Block
捕获了它们进去之后,在Block
里面进行++
操作,Block
结束之后,它们的值依旧可以得以保存下来。
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__Block_byref_a_0 *a; // by ref
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_a_0 *_a, int flags=0) : a(_a->__forwarding) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
__main_block_impl_0
结构体 就是这样把自动变量捕获进来的。也就是说,在执行 Block
语法的时候,Block
语法表达式所使用的自动变量的值是被保存进了Block
的结构体实例中,也就是 Block
自身中。
这里值得说明的一点是,如果Block
外面还有很多自动变量,静态变量,等等,这些变量在Block
里面并不会被使用到。那么这些变量并不会被Block
捕获进来,也就是说并不会在构造函数里面传入它们的值。
Block
捕获外部变量仅仅只捕获Block
闭包里面会用到的值,其他用不到的值,它并不会去捕获。
更多:iOS面试题 答案合集
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。