200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Swift中的循环强引用 【使用无主引用解决】

Swift中的循环强引用 【使用无主引用解决】

时间:2022-03-29 10:46:48

相关推荐

Swift中的循环强引用  【使用无主引用解决】

无主引用(unowned)

声明属性或者变量时,在前面加上unowned关键字表示这是一个无主引用,无主引用不能设置为nil,因为非可选类型的变量不允许被赋值为nil。

两个属性,其中一个为可选类型,另外一个不是可选类型,而且相互引用,这种情况下一般使用无主引用去解决循环强引用。

案例

class Customer {let name: Stringvar card: CreditCard?init(name: String) {self.name = name}deinit { print("\(name) is being deinitialized") }}复制代码

class CreditCard {let number: UInt64unowned let customer: Customerinit(number: UInt64, customer: Customer) {self.number = numberself.customer = customer}deinit { print("Card #\(number) is being deinitialized") }}复制代码

注意CreditCard类的number属性被定义为UInt64类型而不是Int类型,以确保number属性的存储量在 32 位和 64 位系统上都能足够容纳 16 位的卡号。

下面的代码片段定义了一个叫john的可选类型Customer变量,用来保存某个特定客户的引用。由于是可选类型,所以变量被初始化为nilvar john: Customer?

现在你可以创建Customer类的实例,用它初始化CreditCard实例,并将新创建的CreditCard实例赋值为客户的card属性:

john = Customer(name: "John Appleseed")john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)复制代码

在你关联两个实例后,它们的引用关系如下图所示:

Customer实例持有对CreditCard实例的强引用,而CreditCard实例持有对Customer实例的无主引用。

由于customer的无主引用,当你断开john变量持有的强引用时,再也没有指向Customer实例的强引用了:

由于再也没有指向Customer实例的强引用,该实例被销毁了。其后,再也没有指向CreditCard实例的强引用,该实例也随之被销毁了:

john = nil// 打印 “John Appleseed is being deinitialized”// 打印 ”Card #1234567890123456 is being deinitialized”复制代码

最后的代码展示了在john变量被设为nilCustomer实例和CreditCard实例的构造函数都打印出了“销毁”的信息。

注意 上面的例子展示了如何使用安全的无主引用。对于需要禁用运行时的安全检查的情况(例如,出于性能方面的原因),Swift还提供了不安全的无主引用。与所有不安全的操作一样,你需要负责检查代码以确保其安全性。 你可以通过unowned(unsafe)来声明不安全无主引用。如果你试图在实例被销毁后,访问该实例的不安全无主引用,你的程序会尝试访问该实例之前所在的内存地址,这是一个不安全的操作。

引自:/?p=681

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。