阅读背景:

C 【block本质-block内部可以一直引用的变量类型】

来源:互联网 
#import <Foundation/Foundation.h>

// 方法的声明
void test1();
void test2();
void test3();
void test4();

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
//        test1();
//        test2();
//        test3();
        test4();
        
    }
    return 0;
}

int age2 = 18;
void test4()
{
    void (^block4)() = ^{
        NSLog(@"%d", age2); // 输出结果为21。block内部也是可以一直引用全局变量的
    };
    
    age2 = 21;
    
    block4();
}

// block内部能够一直引用被static修饰的变量
void test3()
{
    static int age = 10;
    void (^block3)() = ^{
        NSLog(@"----age=%d", age); // 输出结果为20。与test2方法中的结论类似。被static修饰的变量block也是能一直引用的
    };
    
    age = 20;
    
    block3();
}

// block内部能够一直引用被__block修饰的变量
void test2()
{
    __block int age = 10;

    void (^block2)() = ^{
        NSLog(@"-----age-----%d", age); // 因为age是被__block修饰的变量,所以说age的改变block内是一直知道的,所以输出结果是30
    };
    
    age = 30;
    
    block2();
}

// 普通的局部变量,block内部只会引用它初始的值(block定义那一刻),不能跟踪它的改变
void test1()
{
    int age = 10;
    
//    age = 20; // 如果此行打开,那么输出的结果自然是20,因为block定义时的age是20
    void (^block1)() = ^{
        NSLog(@"-----age-----%d", age); // 相当于 NSLog(@"-----age-----%d", 10); 所以输出结果是10
    };
    
    age = 30; // 不会影响block中的值
    
    block1();
}#import <Foundation/Foundation.h>

// 方法的声明
voi



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: