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)

posted @ 2016-08-23 16:24  EllaDu  阅读(1235)  评论(0编辑  收藏  举报