Swift - @escaping关键字

这个写了不知道多少遍的东西后边写着写着就不知道为什么写了. 而且有时候完全依靠编译器的提醒使用补全功能添加.

其实它是一个非常简单的概念

If a closure is passed as an argument to a function and it is invoked after the function returns, the closure is escaping.

如果一个闭包作为函数的参数, 并且在这个函数执行完毕之前没有执行, 这个闭包就是逃逸闭包

我们大部分时候使用闭包作为参数的目的一般主要是异步回调, 这种情况肯定是在这个函数的作用域之外的(不然就是一个同步执行的闭包)

所以这个标识的意思就是,"注意! 我这个闭包不确定什么时候要调用, 为了我调用时候能够正确执行, 我要捕获闭包里用到的变量了!"

反之, 如果一个闭包参数并没有被@escaping标识, 它其实是不会捕获外部变量, 也不需要弱引用修饰对应变量.

比如

func fetchSomeData(_ completion: () -> Void) {
    completion()
}

override func viewDidLoad() {
    super.viewDidLoad()
      fetchSomeData {
        print(title) // Don't need `self`.title
      }
}

这是一个无意义的示例. 但我们应该注意到了平常用的map filter函数都不需要内部显式self 它们都是同步的不捕获任何变量的闭包

结论

编译器会根据这个修饰符对闭包以及内部变量做出不一样的内存管理. 我们也应该意识到其中的区别来做出不同的处理. 无脑加weak 并不是我们想要的.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 以下翻译自Apple官方文档,结合自己的理解记录下来。翻译基于 swift 3.0.1 原文地址 Closure...
    艺术农阅读 1,631评论 0 3
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,468评论 1 5
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,899评论 2 9
  • 南充是个快速发展的城市。 去年年底我离开了这个城市,那时的西华路、滨江路等地还在进行着大规模地下管网的改造。 今年...
    刘爱国阅读 1,234评论 0 3
  • 午夜半醉抚窗凭,笑看滴雨寒胜冰。 轻惹指间存凉意,是梦是醒是真情。
    寒菊阅读 249评论 0 1