第一章 Blocks入门
以下部分使用实际的例子帮助你开始使用 Blocks。
1.1 声明和使用一个Block
使用^操作符来来声明一个 block 变量和指示 block 文本的开始。Block 本身的主
体被{}包含着,如下面的例子那样(通常使用 C 的 ;符合指示 block 的结束):
该示例的解析如下图:
int multiplier = 7;
NSLog(@"%d",myBlock(3));
// prints 21;
1.2 直接使用Block
在很多情况下,你不需要声明一个 block 变量;相反你可以简单的写一个内联 (inline)的 block 文本,它需要作为一个参数使用。以下的代码使用 qsort_b 函数。 qsort_b 和标准 qsort_r 函数类似,但是它使用 block 作为最后一个参数。
1.3 Cocoa的Blocks
在 Cocoa frameworks 里面有部分方法使用 block 作为参数,通常不是执行一个对 象的集合操作,就是在操作完成的时候作为回调使用。下面的例子显示了如何通过 NSArray 的方法sortedArrayUsingComparat
NSArray * stringsArray = [NSArray arrayWithObjects:@"stirng 1",@"string21",@"string12",@"string11",@"string02", nil];
//
//NSNumericSearch
//NSWidthInsensitiveSearch
/NSForcedOrderingSearch
//取得当前的位置
1.4 __block变量
Blocks 的最大一个特色就是可以修改相同作用域的变量。你可以使用__block 存 储类型修饰符来给出信号要修改一个变量。改编“Cocoa 的 Blocks”所示的例子,你 可以使用一个 block 来计数多少个字符串和 block 中只读变量 currentLocal 相同:
Block 对象提供了一个使用 C 语言和 C 派生语言(如 Objective-C 和 C++)来创建 表达式作为一个特别(ad hoc)的函数。在其他语言和环境中,一个block对象有时候 被成为“闭包(closure)”。在这里,它们通常被口语化为”块(blocks)”,除非在某 些范围它们容易和标准 C 表达式的块代码混淆。
2.1 Block功能
一个 block 就是一个匿名的内联代码集合体:
-
和函数一样拥有参数类型 -
有推断和声明的返回类型 -
可以捕获它的声明所在相同作用域的状态 可以和其他定义在相同作用域范围的 blocks 进行共享更改
-
在相同作用域范围(栈帧)被销毁后持续共享和更改相同作用域范围(栈帧)的状 态
你可以拷贝一个 block,甚至可以把它作为可执行路径传递给其他线程(或者在自 己的线程内传递给run loop)。编译器和运行时会在整个block生命周期里面为所有 block 引用变量保留一个副本。尽管 blocks 在纯 C 和 C++上面可用,但是一个 block 也同样是一个 Objective-C 的对象。
2.2 用处
Blocks 通常代表一个很小、自包的代码片段。因此它们作为封装的工作单元在并 发执行,或在一个集合项上,或当其他操作完成时的回调的时候非常实用。
Blocks 作为传统回调函数的一个实用的替代办法,有以下两个原因:
-
它们可以让你在调用的地方编写代码实现后面将要执行的操作。
因此 Blocks 通常作为框架方法的参数。
-
它们允许你访问局部变量。
而不是需要使用一个你想要执行操作时集成所有上下文的信息的数据结构来 进行回调,你可以直接简单的访问局部变量。
-