[英]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
的強烈引用,這有助於防止強引用周期。 unowned
於weak
的好處是它在優化的構建中更有效,不需要它跟蹤這個引用,並且當它引用的對象被釋放時返回並將其設置為nil
。 unowned
參考也不是可選的,這意味着您不必打開它,消除語法噪音並簡化一個人的代碼。
但是你很明顯不能在任何可能被釋放對象的情況下使用unowned
,因為它顯然不能再為已釋放的對象保留對內存的引用。
有趣的是, evaluatePolicy(_:localizedReason:reply:)
文檔說,“此方法異步評估身份驗證策略。”無論何時處理異步方法,都不建議使用unowned
,因為您不能放心有問題的對象在此期間尚未解除分配。 只有在您知道事實上,如果對象已被釋放,則無法調用閉包的情況下,才使用unowned
。 這似乎不是這種情況。
最后一行,使用unowned
來避免強大的引用周期以及你想要更干凈,更高效的代碼。 但只有當你知道在調用閉包之前對象不可能被釋放時才這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.