代码块是对函数的一种扩展,但是比c语言中的函数指针高级多了。
1.声明和定义。returnType (^blockName)(list of arg) = ^returnType(list of arg){body;};
其中右边的returnType可以省略,因为编译器可以通过代码块的声明来推断函数的返回值;如果代码块没有参数右边的list of arg也可以省略。
int (^square)(int number) = ^int(int number){ return number * number;}; //没有省略返回值
int (^square)(int number) = ^(int number){return number * number;}; //省略返回值
void (^theBlock)() = ^{ printf("Hello Blocks!\n"); };//最简单的形式,没有返回值和参数列表
2.如何使用代码块。
1)可以像函数一样直接调用,并且代码块可以访问跟它作用域一样的局部变量。
int value = 6; int (^multiply_block)(int number) = ^(int number) {return (value * number);}; int result = multiply_block(7); printf("Result = %d\n", result);
2)可以在需要需要传递函数作为参数的地方使用代码块。
NSArray *array = [NSArray arrayWithObjects:@"Amir", @"Mishal", @"Irrum", @"Adam", nil]; NSLog(@"Unsorted Array %@", array); NSArray *sortedArray = [array sortedArrayUsingComparator:^(NSString *object1, NSString *object2) { return [object1 compare:object2]; }]; NSLog(@"Sorted Array %@", sortedArray);
3)代码块可以跟函数指针一样使用typedef 。
typedef double (^MKSampleMultiply2BlockRef)(double c, double d);int main(int argc, const char * argv[]){ MKSampleMultiply2BlockRef multiply2 = ^(double c, double d) { return c * d; }; printf("%f, %f", multiply2(4, 5), multiply2(5, 2)); return 0;}