【无主的自我】是什么意思,有什么好处



我正在尝试集成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的好处在于,它在优化的构建中更高效,不需要它跟踪此引用,并在其引用的对象被释放时返回并将其设置为nilunowned引用也不是可选的,这意味着您不必打开它,从而消除了语法噪音并简化了代码。

但是,在对象可能被解除分配的任何情况下,显然都不能使用unowned,因为它显然不能再为解除分配的对象保留对内存的引用。

有趣的是,evaluatePolicy(_:localizedReason:reply:)文档中说,"此方法异步评估身份验证策略。"任何时候,在处理异步方法时,都不建议使用unowned,因为您无法保证在其间的时间内没有释放有问题的对象。仅在特定情况下使用unowned,因为您知道,如果对象已解除分配,则无法调用闭包。这里的情况似乎并非如此。

最重要的是,使用unowned可以避免强引用循环,以及您想要更干净、更高效的代码的地方。但是只有当您知道在调用闭包之前不可能释放对象时才执行

相关内容

  • 没有找到相关文章

最新更新