弱引用和无主引用之间有什么区别?
Swift有:
无主参考与弱参考有什么不同?
何时可以安全地使用无主参考?
无主引用是否存在安全风险,如C / C ++中的悬挂指针?
weak
引用和unowned
引用都不会strong
保留引用的对象(也就是说,它们不会增加保留计数以防止ARC释放引用的对象)。
但为什么两个关键字? 这种区别与Optional
类型内置Swift语言的事实有关。 关于它们的长话短小:可选类型提供了内存安全性(这与Swift的构造函数规则一致,这对于提供这种好处是严格的)。
一个weak
引用允许它的可能性成为nil
(当被引用的对象被释放时这会自动发生),因此你的属性的类型必须是可选的 - 所以作为程序员,你必须在使用它之前检查它(基本上编译器会迫使你尽可能写出安全的代码)。
一个unowned
参考文献假定它在一生中永远不会变为nil
。 必须在初始化期间设置无主引用 - 这意味着该引用将被定义为非可选类型,可以在没有检查的情况下安全使用。 如果被引用的对象以某种方式被释放,那么当使用无主引用时,该应用程序将崩溃。
从Apple文档:
使用一个弱引用,只要该引用对于该引用在其生命周期的某个点处变为零有效。 相反,如果您知道在初始化过程中设置的引用永远不会为零,请使用无主引用。
在文档中有一些例子讨论了保留周期以及如何分解它们。 所有这些例子都是从文档中提取的。
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
示例显示了两种属性都允许为零的属性有可能导致强烈的参考周期的情况。 这种情况最好用弱引用解决。 两个实体都可以存在,而不会严格依赖另一个实体。
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
,但CreditCard
将始终与Customer
关联。 为了表示这一点, Customer
类有一个可选的card
属性,但CreditCard
类具有非可选的(和无主的) customer
属性。
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Customer
和CreditCard
示例显示了一种情况,其中一个属性允许为零,另一个属性不能为零有可能导致强烈的参考周期。 这种情况最好用无主的参考来解决。
Apple的注意事项:
弱引用必须声明为变量,以表明它们的值可以在运行时更改。 弱引用不能被声明为常量。
还有第三种情况,两个属性应该总是有一个值,并且一旦初始化完成,这两个属性都不应该为零。
还有一些经典的保留周期方案可以避免使用闭包时的情况。
为此,我鼓励您访问Apple文档,或阅读本书。
Q1。 “无主参考”与“弱参考”有什么不同?
弱参考:
一个弱引用是一个引用,它不会强制保留它引用的实例,所以不会停止ARC处理引用的实例。 由于弱引用被允许具有“无值”,因此您必须将每个弱引用声明为具有可选类型。 (Apple Docs)
无主参考:
就像弱引用一样,无主引用不会严格保持它引用的实例。 然而,与弱引用不同,假定无主引用始终有一个值。 因此,无主引用总是被定义为非可选类型。 (Apple Docs)
何时使用每个:
使用一个弱引用,只要该引用对于该引用在其生命周期的某个点处变为零有效。 相反,如果您知道在初始化过程中设置的引用永远不会为零,请使用无主引用。 (Apple Docs)
Q2。 何时可以安全使用“无主参考”?
如上所述,假定无主引用始终有一个值。 因此,只有在确定参考不会为零时才应使用它。 Apple Docs通过以下示例说明了无主引用的用例。
假设我们有两个类Customer
和CreditCard
。 一个客户可以不用信用卡而存在,但是没有客户就不会存在信用卡,也就是说可以假设信用卡总是有客户。 所以,他们应该有以下关系:
class Customer {
var card: CreditCard?
}
class CreditCard {
unowned let customer: Customer
}
Q3。 “无主引用”是否引用C / C ++中的“悬挂指针”等安全风险
我不这么认为。
由于无主引用只是保证有价值的弱引用,因此不应以任何方式存在安全风险。 但是,如果尝试在其引用的实例解除分配后访问无主引用,则会触发运行时错误,并且应用程序将崩溃。
这是我看到的唯一风险。
链接到Apple Docs
如果封闭使用[self self], 自我可能是零。
如果封闭使用[无主自我], 自我永远不会失效 。
如果在使用[无主自我]时崩溃,那么self可能在该闭包中的某个点处为零,您可能需要使用[weak self] 。
查看关于使用强 , 弱和无主闭包的示例:
https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/AutomaticReferenceCounting.html
链接地址: http://www.djcxy.com/p/37675.html上一篇: What is the difference between a weak reference and an unowned reference?