///第一种情况,不加block的情况,全局,静态,和局部变量的区别:
首先全局变量global_a和静态全局变量static_global_b的值增加,以及它们被Block捕获进去,这一点很好理解,因为是全局的,作用域很广,所以Block捕获了它们进去之后,在Block里面进行++操作,就像局部函数一样,可以成功修改全局变量的值,Block结束之后,它们的值依旧可以得以保存下来。自动变量是以值传递方式传递到Block的构造函数里面去的。Block只捕获Block中会用到的变量。由于只捕获了自动变量的值,并非内存地址,所以Block内部不能改变自动变量的值。Block捕获的外部变量可以改变值的是静态变量,静态全局变量,全局变量。
///第二种情况,加了__block 之后的情况:
对于非对象的类型:
__block 修饰的变量,生成了一个结构体A,结构体里面的变量a 的地址传进去block里面结构体的变量,所以block就可以改变变量a。(根本原因就是地址传递)
参考:https://www.jianshu.com/p/710026d5bcfb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
对于对象的类型:
Block会对这样的对象进行retain,所以可能有循环引用的问题。