Swift:无主引用

问题描述 投票:0回答:1

快速文档说

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

但是我们可以将一个无主变量定义为可选变量。似乎没有一个强制性要求非强制性非强制性要求。

弱可选与无主可选之间有什么区别?

 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个回答
0
投票

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

weakunowned之间的主要区别是释放引用对象时发生的情况; weak引用变为nil,而unowned引用仍保留对该对象的引用(现在无效),因此,如果尝试访问它,程序将崩溃。

由于弱参考可能变成nil,因此需要为弱参考使用可选的。在语法上可以使用可选参数作为无主引用,但是语义并不明智。从Swift编程语言书中:

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

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

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

CustomerCreditCard之间的关系与上述弱参考示例中的Apartment和Person之间的关系略有不同。在此数据模型中,客户可能拥有或可能没有信用卡,但是信用卡将始终与该客户相关联。 CreditCard实例永远不会超过其引用的Customer。为了表示这一点,Customer类具有可选的card属性,但是CreditCard类具有未拥有(且非可选)的客户属性。

© www.soinside.com 2019 - 2024. All rights reserved.