我正在尝试集成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
}
答案 0 :(得分:1)
长话短说,它与weak!
相同,因为无主引用只是保证具有值的弱引用。
unowned
用于确定引用将从不为零,因此只能使用非零值进行评估。
与弱引用一样,无主引用也不会对其引用的实例保持强力控制。但是,与弱引用不同,假定无主引用始终具有值。因此,始终将无主引用定义为非可选类型。 (Apple文档)
检查其他答案: What is the difference between a weak reference and an unowned reference?
答案 1 :(得分:0)
unowned
限定符,例如weak
,可防止闭包建立对self
的强引用,这有助于防止强引用周期。 unowned
优于weak
的好处是,它在优化的构建中效率更高,不需要跟踪该引用,而是当对象被引用时返回并设置为nil
它引用的对象被释放。 unowned
引用也不是可选的,这意味着您不必解开包装,从而消除了语法上的干扰并简化了代码。
但是显然,在可能会释放该对象的任何情况下,您都无法使用unowned
,因为它显然不能再保留对已释放对象的内存的引用。
有趣的是,evaluatePolicy(_:localizedReason:reply:)
documentation说:“此方法异步评估身份验证策略。”每当您使用异步方法时,建议不要使用unowned
,因为您不能确定所涉及的对象在这段时间内没有被释放。仅在特定情况下使用unowned
,事实上,如果您知道对象已被释放,则无法调用闭包。情况似乎并非如此。
最底线,请使用unowned
以避免强大的参考周期,以及您想要更简洁,更有效的代码的地方。但是当您知道在调用闭包之前不可能将对象释放时,仅这样做。