【问题标题】:Swift: Unowned referencesSwift:无主引用
【发布时间】:2020-04-14 03:22:51
【问题描述】:

快速文档说

无主引用是使用非可选类型定义的。

但我们可以将无主变量定义为可选。将 unowned 设为非可选似乎并不是硬性要求。

弱可选和无主可选有什么区别?

 class Person {

        let name: String
        var apartment: Apartment?

        init(name: String) {
            self.name = name
            print("\(name) is being initialized")
        }
        deinit {
            print("\(name) is being deinitialized")
        }
    }


    class Apartment {
        let unit: String
        init(unit: String) { self.unit = unit }
        unowned var tenant: Person?
        deinit { print("Apartment \(unit) is being deinitialized") }
    }

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    weakunowned 都不会增加对象的引用计数;也就是说,如果没有剩余的强引用,它们不会阻止对象被释放。

    weakunowned 之间的主要区别在于释放引用的对象时会发生什么; weak 引用变为nil,而unowned 引用仍然持有对对象的(现在无效)引用,因此如果您尝试访问它,您的程序将会崩溃。

    需要对弱引用使用可选项,因为它可以变成nil。对无主引用使用可选项在语法上是可能的,但语义不合理。来自 Swift 编程语言书:

    ...当另一个实例具有相同的生命周期或更长的生命周期时,使用无主引用

    鉴于此定义,unowned 属性不应该为nil。您可以从您的示例中看到这一点;显然,公寓可能没有租户,而目前是租户的人可能不复存在;如果您将unowned 与可选的tenant 一起使用,您将得到一个无效的租户引用。

    考虑一下这与书中给出的信用卡示例之间的区别:

    CustomerCreditCard 之间的关系与上面弱引用示例中看到的 Apartment 和 Person 之间的关系略有不同。在此数据模型中,客户可能有也可能没有信用卡,但信用卡始终与客户相关联。 CreditCard 实例永远不会超过它所引用的 Customer。为了表示这一点,Customer 类有一个可选的 card 属性,但 CreditCard 类有一个无主(非可选)的 customer 属性。

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多