Block的使用
int a = 10; NSLog(@"1-----------%d %p",a,&a); void(^block)(void) = ^{ NSLog(@"2-----------%d %p",a,&a); }; a = 20; block(); NSLog(@"3-----------%d %p",a,&a);
输出结果:
结论:
从输
出结果可以看出block内和block外是两个作用域,内部的指针a和外部的指针a虽然名字一样但他们的内存地址已经不同了,这也就是我们可以内部修改局部变量的原因。在block内部会将局部变量的指正复制一份,这样内部和外部就不是一个指针了,就算你重新给内部指针赋值,也无法改变外部指针的指向,他们只是名字相同。
__block int a = 10; NSLog(@"1-----------%d %p",a,&a); void(^block)(void) = ^{ NSLog(@"2-----------%d %p",a,&a); }; a = 20; block(); NSLog(@"3-----------%d %p",a,&a);
输入结果
结论:
没有通过__block修饰则是将值传进去,而通过__block修饰之后是将变量的内存地址传进去,这样就可以修改变量的值。
static int a = 10; NSLog(@"1-----------%d %p",a,&a); void(^block)(void) = ^{ NSLog(@"2-----------%d %p",a,&a); a = 30; }; a = 20; block(); NSLog(@"3-----------%d %p",a,&a);
输入结果:
结论:静态变量的内存地址一致,所以可以修改变量的值
_a = 10; NSLog(@"1-----------%d %p",_a,&_a); void(^block)(void) = ^{ NSLog(@"2-----------%d %p",_a,&_a); }; _a = 20; block(); NSLog(@"3-----------%d %p",_a,&_a);
输出结果
结论:全局变量的内存地址一致,所以可以修改变量值
总结:1.如果block访问的外部变量是局部变量,那么就是值传递,外界改了,不会影响里面 2.如果block访问的外部变量是__block或者static修饰,或者全局变量,那么就是指针传递,block里面的值和外界属于同一变量,外界改变,里面也会改变
Block的注意事项