Objective-C代码块block的介绍和用法 – Objective-C开发教程

上一章Objective-C开发教程请查看:Objective-C声明、定义函数、调用函数和函数参数
通常一个Objective-C类定义了一系列的数据和相关操作,不过有时可能我们只需要一个简单的操作,并且是快速实现的,OC就提供了这个东西:代码块block。其实就是类似于闭包或lambda表达式,再说的清楚一点就是函数——函数指针。
这样一来,OC的代码块bloc就可以当变量用了(函数指针—函数指针类型),不过又要吐槽,这语法太麻烦了,还不如直接使用函数指针的方式,不过你明白这相当于函数指针比较重要。
OC代码块block声明和定义语法特别要注意的是,block声明相当于声明一个变量,一个函数指针类型的变量(对照C语言),在C语言中使用声明一个函数指针类型的变量的方式如:

void (*pf)(int, int);

上面的声明中,pf是一个函数指针类型的变量,也就是函数指针,多简洁明了!OC中的代码块block的声明方式如下:
returnType (^blockName)(argumentType);

returnType为返回值类型,blockName为代码块的名称,argumentType为参数类型,可以只写参数类型,也可以带参数的名称。下面是一个示例:
void (^myBlock)(void) = ^{ NSLog(@"MY BLOCK"); };

注意注意:myBlock是一个代码块,但是它还不是一个函数,它是一个函数变量,函数变量!这意味着如果你只是声明一个变量,那你就要相应提供实现了。因为函数有参数,所以实现block的时候不要忘记带参数了。
直接赋值给block变量可以使用以下的方式:
void (^myBlock)(int, int); myBlock = ^(int a, int b){ NSLog(@"a +b: %d", a + b); }// 或者 void (^myBlock)(int, int) = ^(int a, int b){ NSLog(@"a +b: %d", a + b); }

调用block使用以下的方式(也就是函数的调用):
myBlock(7, 3);

使用类型定义的代码块block其实就是类似C语言中的typedef对函数类型的定义,基本是一样的,声明方式也是类似,如下:
// 类型定义,块类型 typdef void (^MBlock)(int, int); // 定义变量 MBlock block = ^(int a, int b){ NSLog(@"a +b: %d", a + b); } // 调用 block();

综上,OC中的代码块block其实就是相当于C语言中的函数指针变量,可作为变量使用,同时可用于调用执行特定逻辑。
【Objective-C代码块block的介绍和用法 – Objective-C开发教程】block的其中一个作用就是可充当匿名函数(Java中的匿名类,快速传递一个),另外就是作为回调函数,例如HTTP请求,传递一个block作为HTTP请求完成后的处理。

    推荐阅读