@escaping VS @noescaping

原创
07/28 15:33
阅读数 38

前情提要

内容

swift的闭包上加强了静态检查。它有两个修饰词@escaping@noescape(默认修饰词): @escaping: 逃逸闭包 @noescaping: 非逃逸闭包

 func escapingClosure(_ closure: @escaping ()->Void) {
        self.closure = closure
    }
    
    func noescapingClosure(_ closure: ()->Void) {
        closure()
    }
  • 第一个方法加了@escaping,意味“逃脱”,闭包的生命周期可以逃脱方法的作用域,在方法return后不会销毁,这意味着它的调用时机是不确定的,是异步的。一般用于异步网络请求。

  • 第二个没有修饰词,所以是默认的@noescape,这意味着该闭包不能超出方法的作用域,方法return后闭包就销毁了,所以它是安全的。

举例说明

    var body: some View {
            Button(action: {
                self.data { (data) in
                    print("444---\(data)--\(Thread.current)")
                }
            }){
                Text("Start").font(.largeTitle)
            }
}
    func data(closure:@escaping ((Any) -> Void)) {
        print("111--\(Thread.current)")
        DispatchQueue.global().async {
            DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                print("333--\(Thread.current)")
                closure("555")
            }
        }
        print("222--\(Thread.current)")
    }

/**
111--<NSThread: 0x600003f98880>{number = 1, name = main}
222--<NSThread: 0x600003f98880>{number = 1, name = main}
333--<NSThread: 0x600003f98880>{number = 1, name = main}
444---555--<NSThread: 0x600003f98880>{number = 1, name = main}
*/
  • 逃逸闭包的生命周期是大于函数的
  • 逃逸闭包的生命周期:
    1. 闭包作为参数传递给函数;
    2. 退出函数;
    3. 闭包被调用,闭包生命周期结束。

即逃逸闭包的生命周期大于函数,函数退出的时候,逃逸闭包的引用仍被其他对象持有,不会在函数结束时释放

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部