一个Objective-C的类定义了一个结合数据和相关行为的对象。有时候,我们将它表示为单个的任务或者行为单元比起表示成方法的集合来的更贴切。
blocks是添加在C、Objective-C和C++之上的语言层次特征,它允许你创建代码中明显的功能来运行你的函数或者方法就像值一样传递。Blocks是Objective-C对象,它们意味着可以加入到类似数组、字典之类的集合中去。它们同样有能力从指定的范围内去获取数值,是它们看起来很像其他程序语言中的闭合或者lambdas表达式。
这章解释句法来作为blocks的宣告参考以及怎么使用blocks来简化同样任务中类似枚举这种的集合。
Block 句法
以下句法来定义一个block,通过使用标记(^),像这样
^{
NSLog(@"This is a block");
}
作为方法或函数的定义,这个句法指示了block的开始和结束。在这个例子中,block没有返回任何的值也没有传入任何的参数。
这种写法,同样可以让你使用一个函数指针引用C函数,你可以申明一个变量来跟踪这个block,像这样:
void (^simpleBlock)(void);
这种句法可能看起来有一点与众不同,如果你还不能习惯使用它来处理C函数指针的话。这个例子中,变量名是simpleBlock来指向这个没有参数和返回值的block,它意味着变量分配给上面这个显示的这块文字,像下面这样:
simpleBlock = ^{
NSLog(@"This is a block");
};
这个就像任何其他的变量赋值一样,所以这个表达式必须要在结束括号后用分号进行终止。
void (^simpleBlock)(void) = ^{
NSLog(@"This is a Block");
};
一旦你已经申明并分配了一个block变量,你就可以用它来回调block;
simpleBlock();
注意:如果你企图去毁掉一个block却是用一个没有被分配的变量(一个nil 的block值),你的app就会崩溃。
像这样:
带参数和返回值的Block
blocks 可以带参数和返回值就像的函数和方法一样。举个例子,考虑一个变量来引用两个值相乘结果的block:
double (^multiplyTwoValues)(double,double);
相应的block显示可能像这样:
^(double firstValue ,double secondValue) {
return firstValue * secondValue;
};
这个firstValue和secondValue通常用来指向block回调所提供的值,就像任何方法定义。在这个例子中,返回的类型从block表达式内部可以推理出来。
如果你愿意的话,你可以明确使用一个返回值类型通过插在符号和参数列表之间来说明它:
^double (double firstValue,double secondValue) {
return firstValue * secondValue;
};
一旦你申明和定义了这个block,你可以像一个函数一样的去回调:
double (^multiplyTwoValue)(double,double) = ^(double firstValue,double secondValue) {
return firstValue * secondValue;
};
double result = multiplyTwoValues(2,4);
NSLog(@"The result is %f",result);