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

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

一、
非逃逸闭包:只能在作为参数传入的函数体中调用,可能是在函数结束后会释放掉。(非逃逸,大概就是说逃不出这个函数的手掌心✋)
特点:
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

看起来和懒加载异曲同工, 或者说闭包中的代码其实是另外一个函数, 只有调用的时候才真正运行。虽然自动闭包在语法上并不是严格的函数形式,但是其本质却不会改变,所以所谓的“自动闭包能够延时求值”大概的意思就是:自动闭包是闭包,虽然看起来可能不像闭包,但它真™是闭包啊😂。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容