1. 程式人生 > >逃逸閉包(@escaping)和非逃逸閉包

逃逸閉包(@escaping)和非逃逸閉包

逃逸閉包:當函式執行結束後,才去呼叫函式內部的閉包,叫做逃逸閉包
非逃逸閉包:當函式執行過程中,執行的函式內部的閉包,叫做非逃逸閉包 @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表示

菜鳥一隻,不足之處,還望同行不吝賜教