美文网首页
swift中escaping与noescaping之区别

swift中escaping与noescaping之区别

作者: ksnowlv | 来源:发表于2018-07-16 17:14 被阅读21次

    Swift3之前

    默认@escaping,逃逸闭包,是不安全的。
    对于非逃逸闭包,你需要标记@noescaping
    

    Swift3及之后

    默认是@noescaping,非逃逸的,默认是安全的:
    对于逃逸闭包,它需要被@escaping显示地标记出来.
    

    一.区别

    具体什么区别呢?先举例说明。

    • 1 声明testBlock
    typealias testBlock = (_ type: Int, _ contextObject: Any) -> Void
    
    • 2 noescaping
        func testBlock1(block:testBlock) {
            block(0,"hello");
        }
    
    • 3 escaping
       func testBlock2(block:@escaping testBlock) {
            DispatchQueue.global().async {
                block(1,"world")
            }
        }
    
    • 4 调用
          testBlock1(block:{ (type: Int, contextObject: Any) in
                print("type=\(type),contextObject=\(contextObject)")
            } )
            testBlock2(block: {(type: Int, contextObject: Any) in
                print("type=\(type),contextObject=\(contextObject)")
            })
    
    • 5 输出日志
    type=0,contextObject=hello
    type=1,contextObject=world
    

    二.区别总结

    • 1.@escaping标明这个闭包是会“逃逸”,通俗点来讲,这个闭包的作用域可能超过该函数的作用域,也就是说,该闭包在函数执行完成之后才被调用。

    • 2.@noescaping标明非逃逸的闭包的作用域是不会超过函数作用域的,甚至我们不需要担心在闭包内持有self,超过了作用域引发的问题。

    相关文章

      网友评论

          本文标题:swift中escaping与noescaping之区别

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