block为啥可以修改全局变量而局部变量修改需要加__blcok
block为啥可以修改全局变量而局部变量修改需要加__blcok
block可以修改全局变量,是因为全局变量放在推区,局部变量在栈区,所以不能修改,加上__block之后,相当于加了个标识位,遇到__block就把内存由栈区放在推区。
一、局部变量与block块
你会发现 这么写编译器会报错误。错误截图如下:
所以,对于一个局部变量,block里面这么做是非法的。也就是说使用可以,想改变没门!那么下面加一个修饰 __block (两个下划线一个block) 代码如下:
发现没有编译错误 运行下看看呗
2016-05-23 10:32:56.299 NewStyle[965:50227] TMD加了一个 __block修饰下就好了:200
二、全局变量与block块
嘿,没有报错误。运行下看看喽(理论分析:value本身100,首先value加100,接着加上x的值也是100,自然300喽,看看结果。)
2016-05-23 10:34:18.689 NewStyle[981:51181]看看是不是喽300
一、static静态变量与block块
请看如下代码:
运行结果:
2016-05-23 10:35:07.968 NewStyle[995:51910] TMD用static修饰使用局部变量的结果:200
2016-05-23 10:35:07.969 NewStyle[995:51910]在外面改变number的值,再次调用block的结果:150
有个疑问?static类型 在block里面可以改变吗?上面有提到非static的局部变量在block里面只能使用不能改变。 试试看。代码如下,貌似没有报编译错误。
运行结果如下:
2016-05-23 10:35:07.969 NewStyle[995:51910]在block块里面改变static局部变量number的值:10086
到此为止,上面提出的第二个问题就解开答案了。自动变量是以值传递方式传递到Block的构造函数里面去的。Block只捕获Block中会用到的变量。由于只捕获了自动变量的值,并非内存地址,所以Block内部不能改变自动变量的值。Block捕获的外部变量可以改变值的是静态变量,静态全局变量,全局变量。上面例子也都证明过了。
剩下问题一我们还没有解决。
回到上面的例子上面来,4种变量里面只有静态变量,静态全局变量,全局变量这3种是可以在Block里面被改变值的。仔细观看源码,我们能看出这3个变量可以改变值的原因。
- 静态全局变量,全局变量由于作用域的原因,于是可以直接在Block里面被改变。他们也都存储在全局区。
- 静态变量传递给Block是内存地址值,所以能在Block里面直接改变值。