逃逸閉包:當(dāng)函數(shù)執(zhí)行結(jié)束后,才去調(diào)用函數(shù)內(nèi)部的閉包,叫做逃逸閉包
非逃逸閉包:當(dāng)函數(shù)執(zhí)行過(guò)程中,執(zhí)行的函數(shù)內(nèi)部的閉包,叫做非逃逸閉包 @noescape
類(lèi)型別名總是逃逸的
最后要注意的是,在 Swift 3.0 中琳要,你不能向 typealiases 中添加逃逸或者非逃逸的標(biāo)注。如果你在函數(shù)聲明中對(duì)一個(gè)函數(shù)類(lèi)型的參數(shù)使用了類(lèi)型別名(typealias),這個(gè)參數(shù)總會(huì)被視為逃逸的百侧。這個(gè) bug 已經(jīng)在主分支上修復(fù)了砰识,應(yīng)該會(huì)出現(xiàn)在下一個(gè) release 版本中。
對(duì)于逃逸閉包 和 非逃逸閉包 可以使用一下的方式 我們看下效果
var myCloure0:((Int, Int) -> Int)?
//除了上面的方式外佣渴,我們還用另一種常用的聲明閉包變量的方式辫狼。那就是使用關(guān)鍵字typealias定義一個(gè)特定函數(shù)類(lèi)型,我們就可以拿著這個(gè)類(lèi)型去聲明一個(gè)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")
看了半天其實(shí)沒(méi)什么變化 只是對(duì) @escaping 有無(wú) 1是因?yàn)樵诤瘮?shù)外執(zhí)行 所以 屬于逃逸閉包
現(xiàn)在我們?cè)囈辉?在controlller中的閉包傳值
點(diǎn)擊去下一頁(yè)面的時(shí)候
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
}
下一頁(yè)面返回的時(shí)候
typealias QQQQ = (_ title:String,_ coloer:UIColor)->Void
//定義一個(gè)閉包膨处,帶有兩個(gè)參數(shù)
var bbchange :((_ title:String,_ coloer:UIColor)->Void)?
func initCOl(aa:@escaping QQQQ){
bbchange = aa
}
func bClick(){
bbchange?("成龍",UIColor.red)
self.navigationController?.popToRootViewController(animated: true)
}
其實(shí)可以看出 有無(wú) escaping 均可以 實(shí)現(xiàn)傳值
但是 根據(jù)討論 說(shuō) escaping 是可能會(huì)有循環(huán)引用的問(wèn)題
我們發(fā)現(xiàn) 使用 escaping的時(shí)候
deinit {
print("deinit 方法被執(zhí)行了!!!!")
}
deinit 方法還是被執(zhí)行了!!
是不會(huì)循環(huán)引用么 > < 其實(shí)還沒(méi)有遇到可以循環(huán)引用的情況 待定ing