Conceptual Overview(概览)
Block objects provide a way for you to create an ad hoc function body as an expression in C, and C-derived languages such as Objective-C and C++. In other languages and environments, a block object is sometimes also called a “closure”. Here, they are typically referred to colloquially as “blocks”, unless there is scope for confusion with the standard C term for a block of code.
block对象给你提供了创建C语言和C语言拓展语言,比如objective-C和C++中的 ad hoc函数的可能。在其他语言环境中,block对象有时也被称作“closure”,这里呢,通常用大白话称为:“block”,除非作用域中有复杂的标准C block代码。
Block Functionality(block 功能)
A block is an anonymous inline collection of code that:
-
Has a typed argument list just like a function
-
Has an inferred or declared return type
-
Can capture state from the lexical scope within which it is defined
-
Can optionally modify the state of the lexical scope
-
Can share the potential for modification with other blocks defined within the same lexical scope
-
Can continue to share and modify state defined within the lexical scope (the stack frame) after the lexical scope (the stack frame) has been destroyed
You can copy a block and even pass it to other threads for deferred execution (or, within its own thread, to a runloop). The compiler and runtime arrange that all variables referenced from the block are preserved for the life of all copies of the block. Although blocks are available to pure C and C++, a block is also always an Objective-C object.
一个block是一个匿名内联代码集:
- 像函数一样有一个类型参数列表。
- 有一种推断或声明的返回值类型
- 可以在它定义的词法范围内捕获状态
- 可以随意的在词法作用域里面修改状态
- 可以和相同作用域的block分享修改
- 可以在词法作用域(栈)被销毁后继续分享和修改词法作用域中的状态。
Usage(使用)
Blocks represent typically small, self-contained pieces of code. As such, they’re particularly useful as a means of encapsulating units of work that may be executed concurrently, or over items in a collection, or as a callback when another operation has finished.
Blocks are a useful alternative to traditional callback functions for two main reasons:
-
They allow you to write code at the point of invocation that is executed later in the context of the method implementation.
Blocks are thus often parameters of framework methods.
-
They allow access to local variables.
Rather than using callbacks requiring a data structure that embodies all the contextual information you need to perform an operation, you simply access local variables directly.
- 他们允许你在调用点(函数内容已经结束啦)之后写代码。因此呢block常常作为框架函数的参数出现。
- 他们允许你访问本地变量。相比于回调函数要求操作的所有上下文信息,block只需要直接访问本地变量就行了。