• 闭包和OC的block的本质


    “闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。

    http://blog.csdn.net/yxwlzsh/article/details/46882119

    第一部分: 理论

    什么是闭包

    计算机语言中、“闭包(Closure)是由函数和与其相关的引用环境组合而成的实体.” block就是OC对闭包的实现.(很抽象有木有), Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展.

    将“函数、函数指针、闭包”三者对比起来理解,能加深对闭包的理解: 
    函数: 具有特定功能的代码块; 
    函数指针: 指向函数的指针; 
    闭包:除具备“函数和函数指针”的所有功能外, 还包括声明它的上下文(如作用域内的自由变量等).

    闭包的用途

    维基百度科说了3点:

    1. “惰性求值”特性可用作定义控制语句;
    2. 多函数使用同一个环境;
    3. 实现对象系统.

    哈哈,除了第二点,其它两点暂时体会不到, OC中主要体现也是第二点,有时候这种结构显得非常简洁直观. 网上一些其它说法:

    通常来说,block都是一些简短代码片段的封装,适用作工作单元,通常用来做并发任务、遍历、以及回调。

    闭包的实现

    “典型实现方式是定义一个特殊的数据结构,保存了函数地址指针与闭包创建时的函数的词法环境(also lexical closures or function closures)。”

    block的种类

    Objective-C语言中,一共有3种类型的block: 
    _NSConcreteGlobalBlock 保存在text段的全局的静态block,不会访问任何外部变量。 
    _NSConcreteStackBlock 保存在栈中的block,当函数返回时会被销毁。 
    _NSConcreteMallocBlock 保存在堆中的block,当引用计数为0时会被销毁。

    block的使用注意事项

      1. 在block内直接调用类的实例变量会使self(类的实例)引用计数加1, 这样可能会引起循环引用问题(可以用__weak或local-var处理);
      2. 使用null的block程序会crash. 使用前判断一下:if(blockVar) {//do something…};
      3. 在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。
  • 相关阅读:
    JavaScript中双叹号“!!”作用
    JavaScript两个变量的值交换的多种方式
    自定义npm包——typeScript版本
    自定义npm包的创建、发布、更新和撤销
    vuex概念总结及简单使用实例
    详解javascript: void(0);
    面向对象的CSS
    vue指令概览
    实现水平居中的办法
    C#分块下载文件
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7485366.html
Copyright © 2020-2023  润新知