自动闭包、逃逸闭包和非逃逸闭包三个概念有些不好理解,这里按我自己的理解总结一下,不对的地方请指正
一、
非逃逸闭包:只能在作为参数传入的函数体中调用,可能是在函数结束后会释放掉。(非逃逸,大概就是说逃不出这个函数的手掌心✋)
特点:
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
看起来和懒加载异曲同工, 或者说闭包中的代码其实是另外一个函数, 只有调用的时候才真正运行。虽然自动闭包在语法上并不是严格的函数形式,但是其本质却不会改变,所以所谓的“自动闭包能够延时求值”大概的意思就是:自动闭包是闭包,虽然看起来可能不像闭包,但它真™是闭包啊😂。