Escaping Closure=(逃逸闭包)
如果一个闭包被作为一个参数传递给一个函数, 并且在函数return之后才被唤起执行, 那么这个闭包是逃逸闭包。
【其实用oc时代普通的block作为回调的函数就是这样的,每个block都是希望可以逃避闭包,谁希望马上执行呀】
是个假参数,可以不传,调用者后面跟一个{...}
不逃逸闭包的生命周期:
- Pass a closure into a function
- The function runs the closure (or not)
- The function returns
- then this closure die.
逃逸闭包的生命周期
- 跟不逃逸一样
- 最后的生命周期是closure不会因为function返回而被kill掉;
需要使用 escaping closure的两种case:
- 异步execution
并不能说函数return了就把closure kill掉, 因为这个closure可能还没有执行完毕 - 存储
如果任何全局变量都有一些些存储存在, 那么这个closure也被逃逸掉
插曲
在 Swift 1 和 2中, closure by default 是 escaping的, 所以我们需要用 @noescape 来mark;
在 Swift 3中, closure by default是non-escaping, 我们需要用@escaping 来mark;









网友评论