Swift - @escaping关键字

作者: Zafir_zzf | 来源:发表于2019-06-13 13:55 被阅读0次

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

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

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 并不是我们想要的.

相关文章

  • swift 3.0 之@Never | @escaping

    @escaping Swift3,闭包参数默认为non-escaping,也可以使用@escaping属性关键字为...

  • Swift - @escaping关键字

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

  • Swift 关键字

    以下是自己学习Swift 的一些记录,便于以后查找翻阅 一些关键字 @escaping(es=ex向外,cape=...

  • Swift 3.0中@escaping 和 @noescape

    Swift 3.0中@escaping 和 @noescape 的含义

  • swift @escaping

    @escaping用于函数参数,作用于闭包 在swift2中,有@noescape属性,对应非逃逸闭包,也就是在r...

  • swift3.0中@escaping 和 @noescape 的

    原文What Do @escaping and @noescape Mean In Swift 3 开始用swif...

  • Swift关键字 @escaping逃逸闭包

    某次事件之后,该简书的所有文章都搬到了我自己的网站 我的GitHub Cannot use mutating me...

  • Swift中的闭包

    在Swift中有两种闭包,逃逸闭包(@escaping)和非逃逸闭包(@nonescaping)。从Swift 3...

  • Escaping Closures - Swift

    逃逸闭包和非逃逸闭包 逃逸闭包(escaping closure),什么是逃逸闭包?苹果官方给的定义是:当一个闭包...

  • swift 之@escaping

    在之前,一个函数的参数的闭包的捕捉策略默认是escaping,如果是一个非逃逸闭包需要显示的添加声明@noesca...

网友评论

    本文标题:Swift - @escaping关键字

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