下面请听题
第一题: test会打印什么?因为啥?
typedef void(^TestBlock)(void);
NSString *test = @"test1111";
TestBlock b2 = ^(void){
NSLog(@"%@",test);
};
test = @"test2222";
b2();
原因:
- 当在Block内部“访问”外部变量时,Block会对外部的变量进行一次"临时“的”拷贝“;
- 临时拷贝的结果:把栈区的地址拷贝到堆区
- 其实,在Block内部操作的是拷贝出来的那一份, 对Block外部的变量的真实值不会造成影响。
第二题: label会显示什么字样?
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 300, 300, 40)];
label.text = @"block作用域外赋值++++";
void (^backValue)(NSString *) = ^(NSString *str) {
label.text = str;
};
backValue(@"block作用域内赋值------");
[self.view addSubview:label];
原因:
- 这是对label的使用,而不是赋值,操作的是label一个属性,下面的是赋值操作
label = [[UILabel alloc] init];
网友评论