Block之变量作用域

时间:2023-03-09 04:41:58
Block之变量作用域

在使用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)