Blocks通常代表一个很小、自包的代码片段。因此它们作为封装的工作单元在并
发执行,或在一个集合项上,或当其他操作完成时的回调的时候非常实用。
Blocks作为传统回调函数的一个实用的替代办法,有以下两个原因:
1 ,它们可以让你在调用的地方编写代码实现后面将要执行的操作。
因此Blocks通常作为框架方法的参数。
2. 它们允许你访问局部变量。
而不是需要使用一个你想要执行操作时集成所有上下文的信息的数据结构来
进行回调,你可以直接简单的访问局部变量。
声明和使用一个Block
使用^操作符来来声明一个block变量和指示block文本的开始。Block本身的主
体被{}包含着,如下面的例子那样(通常使用 C 的;符合指示block的结束):
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
Blocks的最大一个特色就是可以修改相同作用域的变量。你可以使用__block存
储类型修饰符来给出信号要修改一个变量。
你同样可以创建blocks的类型。当你在多个地方使用同一个给定的签名的block时,这通常被认为是最佳的办法。
你可以使用^修饰符来标识一个block表达式的开始。它通常后面跟着一个被()包含起来的参数列表。Block的主体一般被包含在 {} 里面。下面的示例定义了一个
简单的block,并把它赋值给前面声明的变量(oneFrom)。这里block使用一个标准 C
的结束符;来结束。
void (^blockReturningVoidWithVoidArgument)(void);
int (^blockReturningIntWithIntAndCharArguments)(int, char);
void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int);
typedef float (^MyBlockType)(float, float);
MyBlockType myFirstBlock = // ... ;
MyBlockType mySecondBlock = // ... ;
防止循环引用 用 __weak 获取将要被retain的对象。
其实 Block 和 swift 的闭包差不多。