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,超过了作用域引发的问题。
网友评论