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 修饰的变量

下图是这三种类型的验证代码:

__block

循环引用

参考