Swift3(非)逃逸闭包

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"
     }
}

原文地址:https://www.cnblogs.com/horo/p/6822677.html