3

我正在尝试集成人脸/触摸 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
    }
4

2 回答 2

1

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

unowned当您确定引用永远不会为 nil 时使用,因此只能使用非 nil 值对其进行评估。

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

检查这个其他答案: 弱引用和无主引用有什么区别?

文档: ARC 文档

于 2019-01-21T23:37:08.070 回答
1

unowned限定符,如,weak阻止闭包建立强引用,self这有助于防止强引用循环。unownedover的好处weak是它在优化构建中效率更高一点,不需要它跟踪这个引用并返回并将它设置为nil它引用的对象被释放的时间。引用也不是可选的unowned,这意味着您不必打开它,消除语法噪音并简化代码。

但是你显然不能unowned在对象可能被释放的任何情况下使用,因为它显然不能再为释放的对象保留对内存的引用。

有趣的是,evaluatePolicy(_:localizedReason:reply:) 文档说:“这种方法异步评估身份验证策略。” 任何时候您处理异步方法时,都不建议使用unowned,因为您无法确定相关对象在此期间没有被释放。仅unowned在您知道如果对象已被释放时无法调用闭包的特定情况下使用。这似乎不是这里的情况。

底线,用于unowned避免强引用循环以及您想要更清洁、更高效的代码的地方。但是只有当你知道在调用闭包之前不可能释放对象时才这样做。

于 2019-01-22T17:18:21.887 回答