什么是[无主的自我],有什么好处?

时间:2019-01-21 23:12:01

标签: swift biometrics touch-id face-id lacontext

我正在尝试集成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
    }

2 个答案:

答案 0 :(得分:1)

长话短说,它与weak!相同,因为无主引用只是保证具有值的弱引用。

unowned用于确定引用将从不为零,因此只能使用非零值进行评估。

  

与弱引用一样,无主引用也不会对其引用的实例保持强力控制。但是,与弱引用不同,假定无主引用始终具有值。因此,始终将无主引用定义为非可选类型。 (Apple文档)

检查其他答案: What is the difference between a weak reference and an unowned reference?

文档: ARC Documentation

答案 1 :(得分:0)

unowned限定符,例如weak,可防止闭包建立对self的强引用,这有助于防止强引用周期。 unowned优于weak的好处是,它在优化的构建中效率更高,不需要跟踪该引用,而是当对象被引用时返回并设置为nil它引用的对象被释放。 unowned引用也不是可选的,这意味着您不必解开包装,从而消除了语法上的干扰并简化了代码。

但是显然,在可能会释放该对象的任何情况下,您都无法使用unowned,因为它显然不能再保留对已释放对象的内存的引用。

有趣的是,evaluatePolicy(_:localizedReason:reply:) documentation说:“此方法异步评估身份验证策略。”每当您使用异步方法时,建议不要使用unowned ,因为您不能确定所涉及的对象在这段时间内没有被释放。仅在特定情况下使用unowned,事实上,如果您知道对象已被释放,则无法调用闭包。情况似乎并非如此。

最底线,请使用unowned以避免强大的参考周期,以及您想要更简洁,更有效的代码的地方。但是当您知道在调用闭包之前不可能将对象释放时,这样做。