概述
苹果在ios4.0版本开始支持block。对于不同编程北京的人来说,对block的理解也不尽相同。c语言擅长者,可以把block理解成函数指针。通俗讲,可以把block理解成为一个内部函数。如下:
function outerFn()
{
function innerFn()
{
/*在这里添加代码*/
}
}
在objective-c编程中,block被看成对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数,也可以作为函数的返回值,block本身又可以带参数或返回值。
block是一个代码块,一般用于函数的回调。block有两大特点:
- block本身是一个对象。既然是对象,就应该遵循对象的用法。block声明的函数,可以立即执行,也可以过一段时间再执行。所谓过一段时间,就是函数的回调,或者说是异步执行,只有满足某一个触发条件才执行。
- block的某一部分功能类似于delegate。如果实现同一个功能,block编写的代码比delegate要简洁、紧凑,只需要写在同一个文件即可,而不像delegate那样分散在多个文件中。
block的声明、实现与调用
block的声明
block的声明格式如下:
ReturnType (^blockName)(Parameters)
- "^"的出现,代表它所声明的对象是一个block
- ReturnType:返回类型可以是OC所支持的任何数据类型,可以实void
- ^blockName:block名称。
/*示例*/
int (^firstBlock)(NSString *param1, int param2);
void (^showName)(NSString *myName);
NSDate *(^whatDayIsIt)(void);
void (^allVoid)(void);
NSString *(^composeName)(NSString *firstName, NSString *lastName);
/*简化参数名*/
int (^firstBlock)(NSString *, int);
void (^showName)(NSString *);
NSDate *(^whatDayIsIt)(void);
void (^allVoid)(void);
NSString *(^composeName)(NSString *, NSString *);
block的实现
声明一个block,只是给出了block存在的形式,至于这个block具体能做什么,则取决于它的实现。从逻辑上讲,先声明一个block,再实现它。实现样式如下:
^(Paramters){
/*block body*/
return ReturnValue;
};
- 没有出现blockName,这就是说,在block实现中,不用blockName
- 传递参数的名称是必须的,因为参数必然被调用,仅仅靠参数类型是无法被调用的。
- 以分号结尾。
- 在block body中,完成一系列操作后,返回一个result(对象),并把这个result赋值给block Name
- 回调函数的处理。应用场景是:当满足的条件触发后,开始调用并执行这个函数,如网络数据请求。
/*示例*/
^(int a, int b){
int result = a * b;
return result;
};
/*示例*/
int (^howMany)(int, int) = ^(int a, int b){
return a + b;
};