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赋值,作为函数参数,甚至作为函数返回值。
本文详细介绍了 Objective-C 中 Block 的定义与使用方法,包括如何通过 Block 截获变量值以及如何允许 Block 修改外部变量等内容。此外还探讨了 Block 作为函数参数和返回值的应用场景。
409

被折叠的 条评论
为什么被折叠?



