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

来源:互联网 发布:sql注入攻击举例 编辑:程序博客网 时间:2024/04/27 20:30
#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();}

1 0
原创粉丝点击