上一章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请求完成后的处理。
推荐阅读
- Objective-C数字对象NSNumber – Objective-C开发教程
- Objective-C声明、定义函数、调用函数和函数参数 – Objective-C开发教程
- Objective-C条件语句详解 – Objective-C开发教程
- Objective-C循环语句和循环控制语句 – Objective-C开发教程
- Objective-C六大类型操作符详解 – Objective-C开发教程
- Objective-C使用变量和常量 – Objective-C开发教程
- Objective-C基本语法和数据类型 – Objective-C开发教程
- Xcode Target、Scheme、Build Settings、Porject和Workspace介绍 – Objective-C开发教程
- Objective-C程序结构和项目结构介绍 – Objective-C开发教程