案例1:
int aa = 42;
void (^show)(int a) = ^(int a){
NSLog(@"aa = %d",aa);
}
aa = 50;
show(34);
打印结果为42;
block会把aa变量复制为自己私有的const变量,也就是说block会捕获栈上的变量(或指针),将其复制为自己私有的const变量。在例子1中,在进行aa = 50的操作的时候,block已经将其复制为自己的私有变量,所以这里的修改对block里面的aa不会造成任何影响。
案例2:
__block int aa = 42;
void (^show)(int a) = ^(int a){
NSLog(@"aa = %d",aa);
}
aa = 50;
show(34);
打印结果: aa = 50
aa是一个局部变量,存储在栈区的。给aa加入__block修饰符所起到的作用就是只要观察到该变量被block所持有,就将该变量在栈中的内存地址放到堆中,此时不管block外部还是内部aa的内存地址都是一样的,进而不管在block外部还是内部都可以修改aa变量的值,所以aa = 50之后,在block输出的值就是50了。