Swift3(非)逃逸闭包

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"
     }
}
相关文章
相关标签/搜索