之前分享了协议实现回调的方法,后来经过更多的学习才知道闭包也能很轻松的实现回调。
闭包分为逃逸闭包和非逃逸闭包两种,下面就来举两个小例子来对比下两种闭包吧。
代码实现:概念:一个接受闭包作为参数的函数,该闭包可能在函数返回后才被调用,也就是说这个闭包逃离了函数的作用域,这种闭包称为逃逸闭包。例如网络请求。
override func viewDidLoad() {
super.viewDidLoad()
escapingClosure { (info) in
print("逃逸闭包回调结果:\(info)")
}
}
func escapingClosure(setData:@escaping (Any) -> Void) {
print("开始调用逃逸闭包")
DispatchQueue.global().async {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: {
setData("escaping")
})
}
print("逃逸闭包结束")
}
输出结果:
回调结果是延迟了一秒钟打印出来的。由此可见:逃逸闭包的生命周期是长于函数的,函数退出的时候,逃逸闭包的引用仍被其他对象持有,不会在函数结束时释放。
非逃逸闭包:代码实现:概念:一个接受闭包作为参数的函数,闭包是在这个函数结束前内被调用。
override func viewDidLoad() {
super.viewDidLoad()
noescapingClosure { (info) in
print("非逃逸闭包回调结果:\(info)")
}
}
func noescapingClosure(setData: (Any) -> Void) {
print("开始调用非逃逸闭包")
setData("noescaping")
print("非逃逸闭包结束")
}
输出结果:
非逃逸闭包在函数结束前被正常调用。
比较有意思的是,Swift的1,2版本默认逃逸闭包,从第3版本开始默认非逃逸闭包,应该也是为了内存优化,上面两个小例子还是比较清晰的,希望大家以后能正确使用闭包,避免内存浪费哈。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)