我正在尝试集成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!
相同,因为无主引用只是保证有值的弱引用。
当您确定引用将NEVER为零时,将使用unowned
,因此,只能使用非零值对其进行评估。
与弱引用一样,无主引用不会对其引用的实例保持强控制。然而,与弱引用不同,无主的引用被认为总是有值的。因此,无主引用总是被定义为非可选类型(Apple Docs)
检查其他答案:弱引用和无主引用之间的区别是什么?
文档:ARC文档
unowned
限定符与weak
一样,可防止闭包建立对self
的强引用,这有助于防止强引用循环。与weak
相比,unowned
的好处在于,它在优化的构建中更高效,不需要它跟踪此引用,并在其引用的对象被释放时返回并将其设置为nil
。unowned
引用也不是可选的,这意味着您不必打开它,从而消除了语法噪音并简化了代码。
但是,在对象可能被解除分配的任何情况下,显然都不能使用unowned
,因为它显然不能再为解除分配的对象保留对内存的引用。
有趣的是,evaluatePolicy(_:localizedReason:reply:)
文档中说,"此方法异步评估身份验证策略。"任何时候,在处理异步方法时,都不建议使用unowned
,因为您无法保证在其间的时间内没有释放有问题的对象。仅在特定情况下使用unowned
,因为您知道,如果对象已解除分配,则无法调用闭包。这里的情况似乎并非如此。
最重要的是,使用unowned
可以避免强引用循环,以及您想要更干净、更高效的代码的地方。但是只有当您知道在调用闭包之前不可能释放对象时才执行。