(1)局部变量(自动变量)截获其值
代码部分- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.myLabel];
__weak typeof(self) weakSelf = self;
int bug = 100;
void (^block)(void) = ^(){
weakSelf.myLabel.text = [NSString stringWithFormat:@"%d",bug];
};
bug = 88;
block();
}
#pragma mark - lazy load
- (UILabel*)myLabel
{
if (!_myLabel) {
_myLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 80, 100, 40)];
_myLabel.backgroundColor = [UIColor yellowColor];
_myLabel.font = [UIFont systemFontOfSize:15];
_myLabel.textAlignment = NSTextAlignmentCenter;
}
return _myLabel;
}
复制代码
.m文件利用clang命令编译成c++重的.cpp文件,如下图所示: bloc内部定义了自己的bug变量,并对外部变量值进行截获,当改变外部变量时,回调block时,block内部bug变量未改变。外部bug变量和block内部bug变量是两个不同的变量。
(2)静态局部变量 block内部截获的是指针(*bug),无论值怎么改变,回调时,都时指向同一块区域的地址,即拿到同样的值,如下图所示: 代码部分:- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.myLabel];
__weak typeof(self) weakSelf = self;
static int bug = 100;
void (^block)(void) = ^(){
weakSelf.myLabel.text = [NSString stringWithFormat:@"%d",bug];
};
bug = 88;
block();
}
#pragma mark - lazy load
- (UILabel*)myLabel
{
if (!_myLabel) {
_myLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 80, 100, 40)];
_myLabel.backgroundColor = [UIColor yellowColor];
_myLabel.font = [UIFont systemFontOfSize:15];
_myLabel.textAlignment = NSTextAlignmentCenter;
}
return _myLabel;
}
复制代码
利用clang命令编译成c++的.cpp文件,如下图所示:
(3)对于全局变量,block不做截获,因为全局变量的作用域为文件内整个函数。生命周期也是程序结束,随时可以拿到值。