Swift

Swift中逃逸闭包、非逃逸闭包、自动闭包

2022-07-12  本文已影响0人  CicadaJZ

逃逸闭包

当闭包作为函数的参数,且可能在函数结束之后才被调用,即逃离了函数的作用域,我们就说这个闭包是逃逸闭包。

使用\color{SeaGreen}{@escaping}修饰形参,明确闭包是允许逃逸的。
使用@escaping修饰闭包后,必须在闭包中显示的使用self。
可能会产生循环引用,因为需要在闭包中显示的使用self。
一般用于异步函数的返回,例如网络请求。

非逃逸闭包

当闭包作为函数的参数,且是在函数结束之前被调用,我们就说这个闭包是非逃逸闭包。

不会产生循环引用,因为闭包的作用域是在函数的作用域内,函数执行完后就会释放掉闭包所捕获的对象。
非逃逸闭包捕获的上下文在栈上,不是在堆上。
针对非逃逸闭包,编译器会做优化,例如当明确了闭包的生命周期后,就可以省去一些retain和release的调用。

自动闭包

不接收任何参数,返回值是当前内部表达式的值。

使用\color{SeaGreen}{@ autoclosure}修饰

上一篇下一篇

猜你喜欢

热点阅读