声明一个块代码的引用
块代码变量用来保存到块代码的引用。使用和声明函数指针相识的语法声明块代码变量,只是把其中的*换成占位符^。块代码类型基本上都是C语言的格式。下面就是一些有效的块代码变量声明:
void (^blockReturningVoidWithVoidArgument)(void); |
int (^blockReturningIntWithIntAndCharArguments)(int, char); |
void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int); |
块代码同样支持可变参数列表。没有参数的块代码必须在参数列表中使用void。
块代码在传入参数,返回值等方面使用元数据验证,在设计上达到数据安全的目的。你可以把一个块代码的引用转换成一个任何类型的指针,反之亦然。但是你不能通过一个指针引用来对一个块代码引用进行解引用--因为在编译时期不能计算块代码所占大小。
你可以创建块代码的类型--只是你在多个地方创建同一种类型的块代码的最好的方式:
typedef float (^MyBlockType)(float, float); |
MyBlockType myFirstBlock = // ... ; |
MyBlockType mySecondBlock = // ... ; |
创建块代码
使用^标示一个块代码的开始。可能后面跟着使用一对小括号括起来的参数列表。块代码的代码部分是在一对大括号里面。下面是一个块代码定义的示例,并把这个块代码赋值给一个前面声明的块代码变量--和C语言一样,块代码使用一个分号;作为定义的结束:
int (^oneFrom)(int); |
oneFrom = ^(int anInt) { |
return anInt - 1; |
}; |
如果你在块代码定义中没有标示返回值类型,返回值类型会被通过块代码的内容推断出来,如果这个返回值是推断出来的,并且参数列表是void,你可以省略这个void。如果多个return语句出现,他们必须返回完全相同类型的值(合适的时候必须使用转换)。
全局块代码
在文件作用域内,你可以定义一个块代码具有全局可用的:
#import |
int GlobalInt = 0; |
int (^getGlobalInt)(void) = ^{ return GlobalInt; }; |