[英]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
的强烈引用,这有助于防止强引用周期。 unowned
于weak
的好处是它在优化的构建中更有效,不需要它跟踪这个引用,并且当它引用的对象被释放时返回并将其设置为nil
。 unowned
参考也不是可选的,这意味着您不必打开它,消除语法噪音并简化一个人的代码。
但是你很明显不能在任何可能被释放对象的情况下使用unowned
,因为它显然不能再为已释放的对象保留对内存的引用。
有趣的是, evaluatePolicy(_:localizedReason:reply:)
文档说,“此方法异步评估身份验证策略。”无论何时处理异步方法,都不建议使用unowned
,因为您不能放心有问题的对象在此期间尚未解除分配。 只有在您知道事实上,如果对象已被释放,则无法调用闭包的情况下,才使用unowned
。 这似乎不是这种情况。
最后一行,使用unowned
来避免强大的引用周期以及你想要更干净,更高效的代码。 但只有当你知道在调用闭包之前对象不可能被释放时才这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.