繁体   English   中英

什么意思[无主自我],有什么好处?

[英]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的强烈引用,这有助于防止强引用周期。 unownedweak的好处是它在优化的构建中更有效,不需要它跟踪这个引用,并且当它引用的对象被释放时返回并将其设置为nil unowned参考也不是可选的,这意味着您不必打开它,消除语法噪音并简化一个人的代码。

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

有趣的是, evaluatePolicy(_:localizedReason:reply:) 文档说,“此方法异步评估身份验证策略。”无论何时处理异步方法,都不建议使用unowned ,因为您不能放心有问题的对象在此期间尚未解除分配。 只有在您知道事实上,如果对象已被释放,则无法调用闭包的情况下,才使用unowned 这似乎不是这种情况。

最后一行,使用unowned来避免强大的引用周期以及你想要更干净,更高效的代码。 只有当你知道在调用闭包之前对象不可能被释放时才这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM