#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