【问题标题】:What means [unowned self] and what are the benefits?什么是[无主的自我],有什么好处?
【发布时间】:2019-06-15 09:05:42
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

文档: ARC Documentation

【讨论】:

    【解决方案2】:

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

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

    有趣的是,evaluatePolicy(_:localizedReason:reply:)documentation 表示:“此方法异步评估身份验证策略。”任何时候处理异步方法时,都不建议使用unowned,因为您无法确定在此期间有问题的对象没有被释放。仅在那些特定情况下使用unowned,事实上,如果对象已被释放,则无法调用闭包。这似乎不是这里的情况。

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

    【讨论】:

    • 解除分配是什么意思?
    • 当最后一个强引用被移除时,对象将被释放,它曾经占用的内存将被用于其他用途。在视图控制器的情况下,它通常在被解除后被释放。因此,如果您有一个在调用异步闭包之前关闭的视图控制器,unowned 引用将是一个悬空指针,仍然指向它曾经占用的内存,而weak 引用将设置为@987654336 @ 一旦视图控制器被释放,避免对旧内存地址的任何不安全引用。
    • 所以即使视图控制器被释放,我也总是可以访问 self 吗?
    • 这取决于您所说的“访问”是什么意思。如果视图控制器已被释放,您显然无法“访问”它,因为它已经消失了。你得到的是对该内存位置的引用,它假设视图控制器仍然存在,即使它不存在。简而言之,如果self 有可能在闭包运行之前被释放,那么您根本不应该使用unowned。但是,如果您遇到不同的情况,在关闭运行之前从技术上讲不可能将其释放,那么请使用 unowned 并享受适度的好处。
    • "但只有当您知道在调用闭包之前不可能释放对象时。"比如什么时候?您是否有实际需要使用unowned 的答案?我找不到一个简单易懂的:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多