逃逸閉包(@escaping)和非逃逸閉包
阿新 • • 發佈:2018-12-30
逃逸閉包:當函式執行結束後,才去呼叫函式內部的閉包,叫做逃逸閉包
非逃逸閉包:當函式執行過程中,執行的函式內部的閉包,叫做非逃逸閉包 @noescape
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
loadData { (json: [String]) in
print(json)
}
setupUI { (result) in
print(result)
}
}
func loadData(completion:@escaping (_ : [String])->()) {
DispatchQueue.global().async {
print("當前的現成\(Thread.current))")
Thread.sleep(forTimeInterval: 3)
let json = ["lausen"]
DispatchQueue.main.async {
print ("當前的現成\(Thread.current)");
completion(json)
}
print("執行到這兒結束了") //函式結束後才去呼叫的閉包這個就是逃逸閉包
}
}
func setupUI(completion: (_ : [String]) -> ()) { //而這個就是非逃逸閉包
let json = ["liuxiang","lausen","somnus"]
completion(json)
}
}
注意:寫閉包引數的時候,很容易忽略去判斷這個閉包是不是逃逸的,這對閉包的記憶體管理很不友好,都當做了逃逸閉包處理,所以在Swift3中做除了一個對調的改變,所有的閉包都預設為非逃逸的,不在需要@noescape;如果是逃逸閉包,就用@escaping表示
菜鳥一隻,不足之處,還望同行不吝賜教