Swift3.0更新以后对闭包的属性进行了调整,之前默认的是逃避策略,如果是一个非逃逸闭包则需加上@noescape
。在更新之后,则恰恰相反。
这两种属性的区别在于,non-escape function执行完,closure也执行结束,closure里面的对象不会被retain;
反之,closure执行时间不确定,不能保证在function结束后也结束,需要显示的调用self对象,这里有会循环应用的问题。
所以在处理@escaping
的闭包时应该注意:
func aAction(block: @escaping () -> Void) {}
func bAction() {
//block中有self对象时,要弱引用self
a.aAction { [weak self] in
guard let strongSelf = self else { return }
strongSelf.b = "xxx"
}
}