一尘不染

弱引用和非引用之间有什么区别?

swift

斯威夫特有:

  • 强引用
  • 参考文献薄弱
  • 无人参考

无主引用与弱引用有何不同?

什么时候可以使用无主引用安全?

无主引用是否像C / C
++中的悬空指针一样具有安全风险?


阅读 251

收藏
2020-07-07

共1个答案

一尘不染

双方weakunowned引用不创建一个strong被引用的对象上保持(又名它们不会取消分配引用的对象增加,为了保留计数,以防止电弧)。

但是为什么要两个关键词呢?这种区别与Optional类型内置在Swift语言中这一事实有关。长话短说:可选类型提供了内存安全性(这与Swift的构造函数规则完美结合-
为了提供这种好处而严格)。

一个weak参考允许它可能成为nil(这个自动引用对象被释放情况),因此你的财产的类型必须是可选的-
所以你,作为一个程序员,有义务使用它(基本上是前检查编译器会尽力迫使您编写安全的代码)。

一个unowned参考假定它永远不会成为nil其生命周期内。在初始化期间必须设置一个无主引用-
这意味着该引用将被定义为一种非可选类型,无需检查即可安全使用。如果以某种方式释放了要引用的对象,则当使用无主引用时,应用程序将崩溃。

Apple文档

只要有效的引用在其生存期内的某个时候变为零就使用弱引用。相反,当您知道一旦在初始化期间将其设置为零,便可以使用无主引用。

在文档中,有一些示例讨论了保留周期以及如何打破它们。所有这些示例均摘自docs

weak关键字示例:

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    weak var tenant: Person?
}

现在,对于一些ASCII艺术(您应该去看一下文档
-它们有漂亮的图表):

Person ===(strong)==> Apartment
Person <==(weak)===== Apartment

PersonApartment实施例显示的情况下两个属性,这两者都允许是零,有可能引起强烈的基准周期的潜力。用弱引用可以最好地解决此情况。两个实体都可以存在而不必严格依赖另一个实体。

unowned关键字示例:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) { self.name = name }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}

在此示例中,a Customer可能具有或可能不具有CreditCard,但a CreditCard 将始终
与关联Customer。为了表示这一点,Customer该类具有可选card属性,但是CreditCard该类具有非可选(且没有customer所有权)属性。

Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard

CustomerCreditCard实施例示出了其中被允许是nil一个属性并且不能是零另一个属性具有引起很强的参考周期的电势的情况。最好使用无主引用来解决此情况。

苹果的注意事项:

弱引用必须声明为变量,以指示其值可以在运行时更改。弱引用不能声明为常量。

还有第三种情况,即两个属性都应始终具有值,并且初始化完成后,两个属性都不应为零。

此外,在使用闭包时,还可以避免经典的保留周期方案。

为此,我鼓励您访问Apple文档或阅读本书

2020-07-07