问:什么是Block?
Block是将函数及其执行上下文封装起来的对象
Block的调用,既是函数的调用
截获变量
__block修饰符
一般情况下,对被截获变量进行赋值操作需添加 __block修饰符
赋值 != 使用
上面代码可以正常执行
array是局部变量,会被捕获进去,捕获进去的是NSMutableArray *array,array是指针变量,array本身不可以做修改,但是array指针指向的变量可以修改,也就是[array addobject:@123]没有问题
上面代码不可以执行
array = [NSMutableArray array];要修改的是指针变量array本身存储的内容,是不可以的。
类似于捕获的局部变量int a = 10;在block里面,a = 5;是不允许的。
- (void)viewDidLoad {
[super viewDidLoad];
__block int multiplier = 10;
_blk = ^int(int num){
return num *multiplier;
};
multiplier = 6;
[self executeBlock];
}
- (void)executeBlock
{
int result = _blk(4);
NSLog(@"result = %d", result);
}
结果:
result = 24
需要注意的是:
multiplier = 6;不是对int型multiplier赋值,而是
multiplier.__forwaring->multiplier = 6;
__block类型的multiplier对象里面的__forwaring指针,指向堆上面的int型multiplier,然后赋值6。
题外话
multiplier.__forwaring->multiplier = 6;
而不是
multiplier->__forwaring->multiplier = 6;
因为multiplier是结构体,
结构体访问成员变量是使用.
__forwaring是结构体指针
结构体指针访问成员变量是->
代表(*结构体指针).成员变量
其余Block内容没有什么新的知识点,不表