大佬教程收集整理的这篇文章主要介绍了弱引用和非引用之间有什么区别?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
双方weak@H_772_4@并
uNowned@H_772_4@引用不创建一个
strong@H_772_4@被引用的对象上保持(又名它们不会取消分配引用的对象增加,为了保留计数,以防止电弧)。
但是为什么要两个关键词呢?这种区别与Optional@H_772_4@类型内置在Swift语言中这一事实有关。长话短说:可选类型提供了内存安全性(这与Swift的构造函数规则完美结合-
为了提供这种好处而严格)。
一个weak@H_772_4@参考允许它可能成为
nil@H_772_4@(这个自动引用对象被释放情况),因此你的财产的类型必须是可选的-
所以你,作为一个程序员,有义务使用它(基本上是前检查编译器会尽力迫使您编写安全的代码)。
一个uNowned@H_772_4@参考假定它永远不会成为
nil@H_772_4@其生命周期内。在初始化期间必须设置一个无主引用-
这意味着该引用将被定义为一种非可选类型,无需检查即可安全使用。如果以某种方式释放了要引用的对象,则当使用无主引用时,应用程序将崩溃。
从Apple文档:
在文档中,有一些示例讨论了保留周期以及如何打破它们。所有这些示例均摘自docs。
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?
}
@H_772_4@
现在,对于一些ASCII艺术(您应该去看一下文档 -它们有漂亮的图表):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
@H_772_4@
在Person@H_772_4@和
Apartment@H_772_4@实施例显示的情况下两个属性,这两者都允许是零,有可能引起强烈的基准周期的潜力。用弱引用可以最好地解决此情况。两个实体都可以存在而不必严格依赖另一个实体。
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 }
}
@H_772_4@
在此示例中,a Customer@H_772_4@可能具有或可能不具有
CreditCard@H_772_4@,但a
CreditCard@H_772_4@
与关联
Customer@H_772_4@。为了表示这一点,
Customer@H_772_4@该类具有可选
card@H_772_4@属性,但是
CreditCard@H_772_4@该类具有非可选(且没有
customer@H_772_4@所有权)属性。
Customer ===(strong)==> CreditCard
Customer <==(uNowned)== CreditCard
@H_772_4@
在Customer@H_772_4@和
CreditCard@H_772_4@实施例示出了其中被允许是nil一个属性并且不能是零另一个属性具有引起很强的参考周期的电势的情况。最好使用无主引用来解决此情况。
苹果的注意事项:
还有第三种情况,即两个属性都应始终具有值,并且初始化完成后,两个属性都不应为零。
此外,在使用闭包时,还可以避免经典的保留周期方案。
为此,我鼓励您访问Apple文档或阅读本书。
以上是大佬教程为你收集整理的弱引用和非引用之间有什么区别?全部内容,希望文章能够帮你解决弱引用和非引用之间有什么区别?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。