iOS面试题:block 为什么能够捕获外界变量? __block做了什么事?

研究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面试题 答案合集

你可能感兴趣的:(iOS进阶,iOS面试题,iOS开发,iOS,iOS开发,block,面试,iOS面试题)