代码块是对C语言中函数的扩展,由C语言实现,所以在以C为基础的语言内都是有效的,包括Objective_C,C++和Objective-C++,在Xcode的GCG与Clang工具中是有效的,但这不属于ANSI的C语言标准。
代码块借鉴了函数指针的语法,所以声明方法与之类似。如:
函数指针:void *(my_func)(void){/*放代码*/};
只要把“*”替换成"^"(幂符号)就可以把它转换成一个代码块的定义了。如:
代码块:void ^(my_block)(void){/*放代码*/};
使用例子:
int (^square_block)(int num) = ^(int num){return (num*num);};//注意分号
获取整形参数并返回了这个数字的平方。前面是定义,后面是参数列表与实现内容。
1 代码块使用
如果你将代码块声明为变量,就可以像函数一样使用它了。
int result = square_block(5);//幂符号在定义时才用一下
2 可以使用typedef来简化类型声明
typedef double (^BlockRef)(double c,double d);
BlockRef blockRef1 = ^(double c,double d){return c*d;};
NSLog(@“%d,%d”,blockRef1(2,4),blockRef1(4,5));
3 代码块与变量
本地变量是与代码块一周一范围的内声明的变量。本地变量会被代码块作为常量获取到。所以要修改本地变量的值,必须将它们声明为可以修改的。
错误例子:
double c = 3;
BlockRef1 block1 = ^(double a,double b){c = a*b;};
编译器会报错:Variable is not assignable (missing __block type specifier)
解决方法只需要在double c = 3;前加一个__block就可以了。(又下划线哦)
注:有些变量是无法声明为__block类型的。(1)可变长度的数组 (2)包含可变长度数组与结构体
代码块的内存管理需要专门关注一下,这里不表。
参考:《objective-C基础教程》第2版