block的定义语法类似C中的函数指针,在别的文章里看到一张图很形象:
与定义函数指针相比只是把*换成了^而已。
个人理解,block其实就是一种函数形式,只是在OC中给赋予了一些别的意义。其实block也通常作为回调的。
block相对于OC中的方法,不同的是,它可以定义在方法体里。它被定义后可以做为参数,或者像变量一样赋值。也可以直接运行比如:
blockname();
还有就是block对于外部的变量是可以截获的,但是外部的变量在block里都相当于是const的。因为block只会保存执行block语法瞬间的值
int anInteger = 42;
void (^testBlock)(void) = ^{
NSLog(@"Integer is: %i", anInteger);
};
anInteger = 84;
testBlock();
}
输出是42。
其实block的截获变量的原理很简单,其实就是执行block语法时,把block语法表达式所使用的变量值保存到block结构体中(block的底层实现其实是c语言的结构体)。
如果想定义block能够改变的变量,必须在定义前面加__block关键字
__block int anInteger = 42;
void (^testBlock)(void) = ^{
NSLog(@"Integer is: %i", anInteger);
};
anInteger = 84;
testBlock();
这样输出的就是84
block可以像变量一样,给定义好的block赋值,作为函数参数,甚至作为函数返回值。