iOS Swift 逃逸閉包

2021-07-25 16:59:50 字數 1025 閱讀 2855

逃逸閉包必須滿足下面2個條件:

* 1、閉包作為乙個引數傳到函式中

* 2、閉包在函式返回之後才執行

需要在引數前面加入標註: @escaping,用來指明這個閉包是允許「逃逸」出這個函式的。

注意:將乙個閉包標記為 @escaping 意味著你必須在閉包中顯式地引用

import uikit

/** 逃逸閉包滿足下面2個條件:

* 1、handle閉包作為乙個引數傳到函式payrequest中

* 2、並且handle閉包在函式返回之後才執行

* 需要在引數前面加入標註: @escaping,用來指明這個閉包是允許「逃逸」出這個函式的

* 注意:將乙個閉包標記為 @escaping 意味著你必須在閉包中顯式地引用 self

*/func payrequest(handle:@escaping (data?, urlresponse? ,error?) -> void)

func

somefunctionwithnonescapingclosure

(closure: () -> void)

class

someclass

somefunctionwithnonescapingclosure

}}

在swift標準庫中,有很多這種型別的閉包,比如下面的非同步請求的方法:

open func datatask(with request: urlrequest, completionhandler: @escaping (data?, urlresponse?, error?) -> swift.void) -> urlsessiondatatask

open func datatask(with url: url, completionhandler: @escaping (data?, urlresponse?, error?) -> swift.void) -> urlsessiondatatask

都符合文章開頭提到的逃逸閉包的形成條件。

Swift 逃逸閉包

一般在定義網路請求框架時,會宣告成功閉包,失敗閉包。用來 返回的資料給呼叫者。成功閉包,失敗閉包當然是作為請求方法的引數,這時候會報錯,因為這種閉包必須宣告為逃逸閉包。也就是在閉包型別前加 escaping 當乙個閉包作為引數傳到乙個函式中,但是這個閉包在函式返回之後才被執行,我們稱該閉包從函式中逃...

swift escaping逃逸閉包用法

func insert region escaping region region 當其中需要執行後才返回,非同步執行的,都需要新增escaping.如方法1.func dowork block 呼叫時 dowork 這種形式的閉包預設了一種假設,就是引數中的block的方法會在dowork 返回前...

可選型的非逃逸閉包

簡單來說,是為了管理記憶體。乙個閉包會強引用它捕獲的所有物件 如果你在閉包中訪問了當前物件中的任意屬性或例項方法,閉包會持有當前物件,因為這些方法和屬性都隱性地攜帶了乙個self引數。然而,使用非逃逸的閉包不會產生迴圈引用 編譯器可以保證在函式返回時閉包會釋放它捕獲的所有物件。因此,編譯器只要求在逃...