在block内部如何修改block外部变量,为什么?
使用__block.
block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。block也是一种函数,但是block的执行并不一定发生定义的函数内,如果在block中操作了栈区的变量有可能会出现野指针异常。
__block所以起到的作用只是观察到该变量被block所持有,就将“外部变量“在栈中的内存地址放到堆中(就是拷贝一份放在堆中),进而block内部也可以修改外部变量的值。这时候block内部访问的值是这个“外部变量“在堆中的地址。
__block int a = 0;
NSLog(@"定义前:%p", &a); //栈区
void (^foo)(void) = ^{
a = 1;
NSLog(@"block内部:%p", &a); //堆区
};
NSLog(@"定义后:%p", &a); //堆区
foo();
对于block来说,栈区是红灯区,堆区是绿灯区。