我们在使用block修改外部变量的值的时候如果不加__修饰的话会报错通常我们使用__block修饰。
例如:
__block int a = 10;
void(^changeA)(void) = ^ {
a = 20;
};
changeA();
NSLog(@"%d",a);
很多的时候我们就是这样写,但是为什么呢?
在内存中存在以下分区:
栈:用于存放临时变量,处理速度快,但是因为栈的内存极小,容易产生内存泄漏。
堆:空间大,处理速度一般。
只读数据段:用于存放常量(字面常量,符号常量),不能被修改。
数据段:全部变量
代码段:代码、函数名称。
通过上面的分区我们可以知道,变量声明出来存放到栈上面,而block,默认存放到
NSGlobalBlock 全局的block,NSGlobalBlock类似于函数,存放在代码段。
当block使用了外部的变量时,block存放的位置变成了NSMallockBlock(堆)
_block 修饰以后,会类似于桥接,将被修饰的变量被block所持有,此时该变量也转存到堆空间,所以此时Block内部就可以对外部的变量进行修改
网友评论