swift – 弱引用和无主引用之间的区别是什么?
Swift有:
>强引用 未知参考与弱参考不同? 什么时候使用无主引用是安全的? 是不是所有的引用的安全风险,如dangling pointers在C/C++?
弱引用和无主引用不会对引用对象创建强大的保持(也就是说,它们不会增加保留计数,以防止ARC重新分配引用对象)。
但为什么两个关键字?这个区别与可选类型是内置的Swift语言的事实有关。关于他们的长故事:optional types提供记忆安全(这与Swift’s constructor rules精美 – 这是严格为了提供这个好处)。 弱引用允许它的可行性变为nil(当引用对象被释放时,这是自动发生的),因此您的属性的类型必须是可选的 – 因此,作为一个程序员,您必须在使用它之前检查它基本上编译器强制你,尽可能多地,写安全代码)。 一个无主的引用假定它在它的生命中永远不会变为零。在初始化期间必须设置一个无主引用 – 这意味着引用将被定义为一个非可选类型,可以安全地使用而无需检查。如果不知何故,被引用的对象被释放,那么当使用未被引用的引用时,应用程序将崩溃。 从Apple docs:
在文档中有一些例子,讨论保留周期和如何打破它们。所有这些例子都是从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的另一个属性有可能导致强参考循环的情况。这种情况最好用无主引用解决。 苹果注意事项:
还有第三种情况,两个属性应该总是具有值,并且一旦初始化完成,这两个属性都不应为零。 并且还有经典的保留周期场景,以避免在使用闭包时。 为此,我鼓励您访问Apple docs,或阅读the book。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |