Swift3.0更新之后对闭包的属性进行了调整,以前默认的是逃避策略,若是是一个非逃逸闭包则需加上@noescape
。在更新以后,则偏偏相反。
swift
这两种属性的区别在于,non-escape function执行完,closure也执行结束,closure里面的对象不会被retain;
反之,closure执行时间不肯定,不能保证在function结束后也结束,须要显示的调用self对象,这里有会循环应用的问题。api
因此在处理@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" } }