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