“闭包” 一词来源于如下二者的结合:要执行的代码块(因为自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(做用域)。objective-c
http://blog.csdn.net/yxwlzsh/article/details/46882119算法
计算机语言中、“闭包(Closure)是由函数和与其相关的引用环境组合而成的实体.” block就是OC对闭包的实现.(很抽象有木有), Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展.数据结构
将“函数、函数指针、闭包”三者对比起来理解,能加深对闭包的理解:
函数: 具备特定功能的代码块;
函数指针: 指向函数的指针;
闭包:除具有“函数和函数指针”的全部功能外, 还包括声明它的上下文(如做用域内的自由变量等).多线程
维基百度科说了3点:闭包
- “惰性求值”特性可用做定义控制语句;
- 多函数使用同一个环境;
- 实现对象系统.
哈哈,除了第二点,其它两点暂时体会不到, OC中主要体现也是第二点,有时候这种结构显得很是简洁直观. 网上一些其它说法:并发
一般来讲,block都是一些简短代码片断的封装,适用做工做单元,一般用来作并发任务、遍历、以及回调。函数
“典型实现方式是定义一个特殊的数据结构,保存了函数地址指针与闭包建立时的函数的词法环境(also lexical closures or function closures)。”.net
在Objective-C语言中,一共有3种类型的block:
_NSConcreteGlobalBlock 保存在text段的全局的静态block,不会访问任何外部变量。
_NSConcreteStackBlock 保存在栈中的block,当函数返回时会被销毁。
_NSConcreteMallocBlock 保存在堆中的block,当引用计数为0时会被销毁。线程