微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 弱引用和无主引用之间的区别是什么?

Swift有:

>强引用
>弱参考
>未知参考

未知参考与弱参考不同?

什么时候使用无主引用是安全的?

是不是所有的引用的安全风险,如dangling pointers在C/C++?

弱引用和无主引用不会对引用对象创建强大的保持(也就是说,它们不会增加保留计数,以防止ARC重新分配引用对象)。

但为什么两个关键字?这个区别与可选类型是内置的Swift语言的事实有关。关于他们的长故事:optional types提供记忆安全(这与Swift’s constructor rules精美 – 这是严格为了提供这个好处)。

弱引用允许它的可行性变为nil(当引用对象被释放时,这是自动发生的),因此您的属性的类型必须是可选的 – 因此,作为一个程序员,您必须在使用它之前检查它基本上编译器强制你,尽可能多地,写安全代码)。

一个无主的引用假定它在它的生命中永远不会变为零。在初始化期间必须设置一个无主引用 – 这意味着引用将被定义为一个非可选类型,可以安全地使用而无需检查。如果不知何故,被引用的对象被释放,那么当使用未被引用的引用时,应用程序将崩溃。

Apple docs

Use a weak reference whenever it is valid for that reference to become
nil at some point during its lifetime. Conversely,use an uNowned
reference when you kNow that the reference will never be nil once it
has been set during initialization.

在文档中有一些例子,讨论保留周期和如何打破它们。所有这些例子都是从the 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艺术(你应该去see the docs – 他们有漂亮的图):

Person ===(strong)==> Apartment
Person <==(weak)===== 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 }
}

在此示例中,客户可能有也可能没有信用卡,但信用卡将始终与客户相关联。为了表示这一点,Customer类具有可选的卡属性,但CreditCard类具有非可选(和未归属)客户属性

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

Customer和CreditCard示例显示一个允许为nil的属性和不能为nil的另一个属性有可能导致强参考循环的情况。这种情况最好用无主引用解决

苹果注意事项:

Weak references must be declared as variables,to indicate that their
value can change at runtime. A weak reference cannot be declared as a
constant.

还有第三种情况,两个属性应该总是具有值,并且一旦初始化完成,这两个属性都不应为零。

并且还有经典的保留周期场景,以避免在使用闭包时。

为此,我鼓励您访问Apple docs,或阅读the book

原文地址:https://www.jb51.cc/swift/321722.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐