簡體   English   中英

什么意思[無主自我],有什么好處?

[英]What means [unowned self] and what are the benefits?

我正在嘗試集成Face / Touch ID登錄,但我在一個閉包中看到了蘋果文檔[unowned self] 那是什么,有什么好處? 示例代碼:

let context = LAContext()
    var error: NSError?

    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
        let reason = "Identify yourself!"

        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) {
            [unowned self] (success, authenticationError) in

            DispatchQueue.main.async {
                if success {
                    print("Authenticated!")
                } else {
                    // error
                }
            }
        }
    } else {
        // no biometry
    }

長話短說,它和weak! 因為無主引用只是保證具有值的弱引用。

unowned ,當你確定了參考永遠不會為零時使用,因此,它只能與非零值評估。

與弱引用一樣,無主引用並不會強烈保留它所引用的實例。 然而,與弱引用不同,假定無主引用始終具有值。 因此,無主引用始終定義為非可選類型。 (Apple Docs)

檢查另一個答案: 弱引用和無引用引用之間有什么區別?

文檔: ARC文檔

unowned限定符就像weak一樣,阻止了封閉對self的強烈引用,這有助於防止強引用周期。 unownedweak的好處是它在優化的構建中更有效,不需要它跟蹤這個引用,並且當它引用的對象被釋放時返回並將其設置為nil unowned參考也不是可選的,這意味着您不必打開它,消除語法噪音並簡化一個人的代碼。

但是你很明顯不能在任何可能被釋放對象的情況下使用unowned ,因為它顯然不能再為已釋放的對象保留對內存的引用。

有趣的是, evaluatePolicy(_:localizedReason:reply:) 文檔說,“此方法異步評估身份驗證策略。”無論何時處理異步方法,都不建議使用unowned ,因為您不能放心有問題的對象在此期間尚未解除分配。 只有在您知道事實上,如果對象已被釋放,則無法調用閉包的情況下,才使用unowned 這似乎不是這種情況。

最后一行,使用unowned來避免強大的引用周期以及你想要更干凈,更高效的代碼。 只有當你知道在調用閉包之前對象不可能被釋放時才這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM