# 37、理解“块”这一概念

块其实就是个值，而且自有其相关类型。块类型的语法与函数指针近似。

​ 块的强大之处是：在声明它的范围里，所有变量都可以为其所捕获。有些变量若需在块内修改，需要加上`__block`修饰符。

​ 如果块所捕获的变量是对象类型，那么就会自动保留它。系统在释放这个块的时候，也会将其一并释放。

​ `descriptor`：块对象的总体大小；声明了`copy`与`dispose`两个辅助函数对于的函数指针（在拷贝or丢弃块对象时执行）。

​ 块还会把它所捕获的所有变量都拷贝一份。这些拷贝放在`descriptor`变量后边，捕获了多少个变量，就要占用多少的内存空间。

​ 块定义时时存储在栈重的。一旦复制到堆上，块就成了带引用计数的对象了。后续的复制操作都不会真的执行复制，只是递增快对象的引用计数。

要点：

* 块是C、C++、Objective-C中的词法闭包
* 块可接受参数，也可返回值
* 块可以分配在栈or堆上，也可以时全局的。分配在栈上的块可以拷贝到堆里，此时就跟标砖的OC对象一样，具备引用计数了
