斯威夫特有:
无主引用与弱引用有何不同?
什么时候可以使用无主引用安全?
无主引用是否像C / C ++中的悬空指针一样具有安全风险?
双方weak并unowned引用不创建一个strong被引用的对象上保持(又名它们不会取消分配引用的对象增加,为了保留计数,以防止电弧)。
weak
unowned
strong
但是为什么要两个关键词呢?这种区别与Optional类型内置在Swift语言中这一事实有关。长话短说:可选类型提供了内存安全性(这与Swift的构造函数规则完美结合- 为了提供这种好处而严格)。
Optional
一个weak参考允许它可能成为nil(这个自动引用对象被释放情况),因此你的财产的类型必须是可选的- 所以你,作为一个程序员,有义务使用它(基本上是前检查编译器会尽力迫使您编写安全的代码)。
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
在Person和Apartment实施例显示的情况下两个属性,这两者都允许是零,有可能引起强烈的基准周期的潜力。用弱引用可以最好地解决此情况。两个实体都可以存在而不必严格依赖另一个实体。
Person
Apartment
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
CreditCard
card
customer
Customer ===(strong)==> CreditCard Customer <==(unowned)== CreditCard
在Customer和CreditCard实施例示出了其中被允许是nil一个属性并且不能是零另一个属性具有引起很强的参考周期的电势的情况。最好使用无主引用来解决此情况。
苹果的注意事项:
弱引用必须声明为变量,以指示其值可以在运行时更改。弱引用不能声明为常量。
还有第三种情况,即两个属性都应始终具有值,并且初始化完成后,两个属性都不应为零。
此外,在使用闭包时,还可以避免经典的保留周期方案。
为此,我鼓励您访问Apple文档或阅读本书。