逃逸閉包:當函數執行結束后,才去調用函數內部的閉包,叫做逃逸閉包
非逃逸閉包:當函數執行過程中,執行的函數內部的閉包,叫做非逃逸閉包 @noescape
類型別名總是逃逸的
最后要注意的是,在 Swift 3.0 中,你不能向 typealiases 中添加逃逸或者非逃逸的標注。如果你在函數聲明中對一個函數類型的參數使用了類型別名(typealias),這個參數總會被視為逃逸的。這個 bug 已經在主分支上修復了,應該會出現在下一個 release 版本中。
對于逃逸閉包 和 非逃逸閉包 可以使用一下的方式 我們看下效果
var myCloure0:((Int, Int) -> Int)?
//除了上面的方式外,我們還用另一種常用的聲明閉包變量的方式。那就是使用關鍵字typealias定義一個特定函數類型,我們就可以拿著這個類型去聲明一個Closure變量了,如下所示
var myCloure:((Int, Int) -> Void)?
func setMyCloure(aa: @escaping (Int, Int) -> Void){
// aa(1,2)
myCloure = aa
}
//myCloure!(1,2)
//逃逸閉包
print("(Date().timeIntervalSince1970)" + "time1")
setMyCloure { (a, b) in
print("(Date().timeIntervalSince1970)" + "time2")
print(a,b)
}
myCloure!(1,2)
print("(Date().timeIntervalSince1970)" + "time3")
//非逃逸閉包
func printIfTrue(predicate:(Int, Int)-> Void){
predicate(1,2)
}
print("(Date().timeIntervalSince1970)" + "times1")
printIfTrue { (a, b) -> Void in
print("(Date().timeIntervalSince1970)" + "times2")
print(a,b)
}
print("(Date().timeIntervalSince1970)" + "times3")
看了半天其實沒什么變化 只是對 @escaping 有無 1是因為在函數外執行 所以 屬于逃逸閉包
現在我們試一試 在controlller中的閉包傳值
點擊去下一頁面的時候
let BBTC = ViewController1()
// BBTC.bbchange = { (title:String,coloer:UIColor) in
// self.title = title
// self.view.backgroundColor = coloer
// }
BBTC.initCOl { (title, coloer) in
self.title = title
self.view.backgroundColor = coloer
}
下一頁面返回的時候
typealias QQQQ = (_ title:String,_ coloer:UIColor)->Void
//定義一個閉包,帶有兩個參數
var bbchange :((_ title:String,_ coloer:UIColor)->Void)?
func initCOl(aa:@escaping QQQQ){
bbchange = aa
}
func bClick(){
bbchange?("成龍",UIColor.red)
self.navigationController?.popToRootViewController(animated: true)
}
其實可以看出 有無 escaping 均可以 實現傳值
但是 根據討論 說 escaping 是可能會有循環引用的問題
我們發現 使用 escaping的時候
deinit {
print("deinit 方法被執行了!!!!")
}
deinit 方法還是被執行了!!
是不會循環引用么 > < 其實還沒有遇到可以循環引用的情況 待定ing