但为什么两个关键字?这个区别与可选类型是内置的Swift语言的事实有关。关于他们的长故事:optional types提供记忆安全(这与Swift’s constructor rules精美 – 这是严格为了提供这个好处)。
弱引用允许它的可行性变为nil(当引用对象被释放时,这是自动发生的),因此您的属性的类型必须是可选的 – 因此,作为一个程序员,您必须在使用它之前检查它基本上编译器强制你,尽可能多地,写安全代码)。
一个无主的引用假定它在它的生命中永远不会变为零。在初始化期间必须设置一个无主引用 – 这意味着引用将被定义为一个非可选类型,可以安全地使用而无需检查。如果不知何故,被引用的对象被释放,那么当使用未被引用的引用时,应用程序将崩溃。
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。