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"
     }
}
相關文章
相關標籤/搜索