美文网首页
自动闭包/逃逸闭包/非逃逸闭包

自动闭包/逃逸闭包/非逃逸闭包

作者: 烟影很美 | 来源:发表于2017-03-23 18:19 被阅读57次

    自动闭包、逃逸闭包和非逃逸闭包三个概念有些不好理解,这里按我自己的理解总结一下,不对的地方请指正

    一、
    非逃逸闭包:只能在作为参数传入的函数体中调用,可能是在函数结束后会释放掉。(非逃逸,大概就是说逃不出这个函数的手掌心✋)
    特点:
    1.目前Swift默认的闭包都是非逃逸闭包 用@noescape修饰

    二、逃逸闭包:可以在作为参数传入的函数体外调用(return之后或者多线程延时执行),在这个函数结束后依然可能保存在内存中。
    特点:
    1.用@escaping修饰,可以在传入的函数结束后调用

    三、
    自动闭包:即通过表达式自动生成无参闭包类型
    特点:
    1.语法简便
    2.声明包含自动闭包的函数使用@autoclosure。
    3.自动闭包暗含非逃逸闭包特性,改为逃逸闭包则使用@autoclosure(escaping)
    4.可以延迟求值。

    注意:
    延迟求值。这是一个精(dan)妙(teng)的描述,如果你理解成不需要@escaping修饰就可以多线程延时调用就错了。所以延迟求值到底是什么鬼?百度百科如下:
    http://baike.baidu.com/link?url=Djs1GecdT-YpE2vSBZJlL2iWct0HUjLemRVUwvYZNkmxGjUhuVJNQ_SgXGhuLgWycocvKXP-G3b5B7lCIMSpvXDcMokq3Cc2bIrGJKXCWDurSGpTjRXwaePp7MOyqbLE

    看起来和懒加载异曲同工,在Swift中是通过函数(闭包)来实现的。虽然自动闭包在语法上并不是严格的函数形式,但是其本质却不会改变,所以所谓的“自动闭包能够延时求值”大概的意思就是:自动闭包是闭包,虽然看起来可能不像闭包,但它真™是闭包啊😂。

    相关文章

      网友评论

          本文标题:自动闭包/逃逸闭包/非逃逸闭包

          本文链接:https://www.haomeiwen.com/subject/pwrtottx.html