Block
Block 是什么
Block 对象是 C 级语法和运行时功能。它们类似于标准 C 函数,但除了可执行代码之外,它们还可能包含变量绑定到自动(堆栈)或托管(堆)内存。因此,一个 Block 可以维护一组状态(数据),它可以在执行时使用这些状态来影响行为。
您可以使用 Block 来组合函数表达式,这些表达式可以传递给 API、可选择存储并由多个线程使用。Block 作为回调特别有用,因为 Block 携带要在回调中执行的代码和执行期间所需的数据。
Blocks 在 GCC 和 Clang 中可用,可以在 OS X 10.6+ 以及 iOS 4.0+ 版本中使用 Block。 Blocks 的运行时是开源的,可以在 LLVM 的 compiler-rt 子项目存储库中找到。Blocks 也已提交给 C 标准工作组:N1370: Apple 对 C 的扩展。由于 Objective-C 和 C++ 都源自 C,因此 blocks 被设计为与所有三种语言(以及 Objective-C++)一起使用。
Block 的声明如下:
Block的三种类型
- NSGlobalBlock (全局Block)
- 位于全局区
- 在 Block 内部不使用外部变量,或者只使用静态变量和全局变量
- NSMallocBlock (堆Block)
- 位与堆区
- 在 Block 中使用了局部变量或者对象属性
- 赋值给强引用或 copy 修饰的变量
- NSStackBlock (栈Block)
- 位于栈区
- 在 Block 中使用了局部变量或者对象属性(与 NSMallocBlock 一样)
- 不能赋值给强引用或 copy 修饰的变量
下图是这三种类型的验证代码: