ios基础之一天一道笔试题(3)

请写出下列程序的执行结果:

int a = 10;
void (^block)() = ^{
    NSLog(@"a is %d", a);
};
a = 20;
block(); 
__block int a = 10;
void (^block)() = ^{
    NSLog(@"a is %d", a);
};
a = 20;
block(); 

运行结果:10, 20
解析:本题主要考察队block底层实现的理解,通俗来说,当变量是局部变量时,block可以自动捕获局部变量的值,block的内部实现是生成了新的变量a,将原变量a的值赋给新的变量a,即指向原变量a指向的地址,所以当原变量a的值发生改变时,block内部新生成的变量a的值不会发生改变,而当变量被__block修饰时,block内部新生成的变量a的地址指向原变量a的地址,所以当a的值发生改变时,block内部新生成的a的值也会随之改变。具体可以参考这篇文章:传送门

猜你喜欢

转载自blog.csdn.net/weixin_33824363/article/details/86974648