在使用block的过程中经常会调用不同类型、不同作用域的变量,如果对这些变量作用域的理解稍有偏差,就会出现问题。故此特意整理出block中会经常使用到的几种变量,如有补充,欢迎指出。
1. 局部变量
局部变量会在代码块创建时复制一份并保存为常量。为了帮助理解,先看一段代码:
typedef double (^SampleMultiplyBlockRef)(); double a = 10, b = 20;
SampleMultiplyBlockRef multiply = ^(){
return a * b;
};
NSLog(@"%f", multiply()); //200
a = 20, b = 50;
NSLog(@"%f", multiply()); /200
代码块中的变量a和变量b实际上只是copy了局部变量a和b的值,之后即使局部变量a和b改变了,代码块内部的a和b的值并不会随着改变。
2. 全局变量
全局变量与block拥有相同的作用域。看代码:
typedef double (^SampleMultiplyBlockRef)(); static double a = 10, b = 20;
SampleMultiplyBlockRef multiply = ^(){
return a * b;
};
NSLog(@"%f", multiply()); //200
a = 20, b = 50;
NSLog(@"%f", multiply()); //1000
3.__block变量
局部变量会被代码块作为常量获取到,如果想要在代码块中改变局部变量的值,必须使用__block 修饰符。
typedef void (^SampleMultiplyBlockRef)(); double a = 10, b = 20;
__block double c;
SampleMultiplyBlockRef multiply = ^(){
c = a * b;
};
multiply();
NSLog(@"%f", c);
此处如果不使用__block修饰符,编译器将会出现警告:Variable is not assignable (missing __block type specifier)