ios-需要掌握的知识点

Swift - @escaping关键字

2019-06-13  本文已影响0人  Zafir_zzf

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

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

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

上一篇下一篇

猜你喜欢

热点阅读