1、全局变量,block可以进行读取和修改。
@interface ViewController () {
NSInteger num;
}
@implementation ViewController
- (void)viewDidLoad {
//1、block修改成员变量
void (^block1)() = ^(){
++num;
NSLog(@"调用成员变量: %ld", num);
};
block1();
}
2、局部变量,block只能读取,不能修改局部变量。这个时候是值传递,如果想修改局部变量,要用__block来修饰,这个时候是引用传递。下面会聊下block的实现原理:
看例子:
//1、调用局部变量,不用__block
NSInteger testNum = 10;
void ( ^ blockNum )() = ^() {
//testNum = 1000; 这样是编译不通过的
NSLog(@"修改局部变量: %ld", testNum); //打印:10
};
testNum = 20;
blockNum();
NSLog(@"testNum最后的值: %ld", 20); //打印:30
//2、修改局部变量,要用__block
__block NSInteger testNum2 = 10;
void (^blockNum2)() = ^() {
NSLog(@"读取局部变量: %ld", testNum2); //打印:20
testNum2 = 1000;
NSLog(@"修改局部变量: %ld", testNum2); //打印:1000
};
testNum2 = 20;
blockNum2();
testNum2 = 30;
NSLog(@"testNum最后的值: %ld", testNum2); //打印:30
网友评论