在使用Block的时候,如果尝试去修改外部变量的值,此时是会报警告的
我们最常见的做法就是在需要修改的变量前加上 __block 修饰,例如:
__block int a = 10;
void(^changeA)(void) = ^ {
a = 20;
};
changeA();
// 执行完之后可以发现a的值变成了20
很多时候,我们都直接这样去操作,但是为什么加上__block之后,就可以这样操作?
在内存中分区大致可分为:
栈:用于存放临时变量,处理速度快,但是因为栈内存极小,容易产生内存泄漏
堆:空间大,处理速度一般
只读数据段:用于存放常量(字面常量,符号常量),不能被修改
数据段:全部变量
代码段:代码,函数名等
通过上面的分区我们可以知道
变量声明出来存放在栈上面
而block,默认存放在NSGlobalBlock 全局的block;我们常常把block和C中的函数做对比,此时也类似,NSGlobalBlock类似于函数,存放在代码段
当block内部使用了外部的变量时,block的存放位置变成了NSMallockBlock(堆)
__block 修饰以后,会类似于桥接,将被修饰的变量被block所持有,此时该变量也转存到堆空间,所以此时Block内部就可以对外部的变量进行修改
(还有NSStatckBlock位于栈内存)
以上只是个人的理解,如果有错误的地方,希望大家指正,感谢!