【问题标题】:Why can't I give an unowned constant an initial value?为什么我不能给一个无主常量一个初始值?
【发布时间】:2018-01-24 01:16:39
【问题描述】:
class Example {}
unowned let first = Example()
这会产生错误:
Attempted to read an unowned reference but object 0x60c000005f20 was already deallocated
我正试图深入了解关键字 unowned 的确切作用。
【问题讨论】:
标签:
ios
swift
automatic-ref-counting
unowned-references
【解决方案1】:
来自The Swift Programming Language:
与弱引用一样,无主引用不会对其引用的实例保持强控制。
您创建Example 的新实例,并将其分配给您的无主常量first。没有任何东西对您的 Example 实例具有强引用,因此它会立即被释放。您的无主常量 first 现在持有对该已释放对象的引用,因此您会收到错误,即您正试图读取已释放对象。
unowned 关键字用于创建对对象的弱引用,您可以保证被引用对象的生命周期与引用对象的生命周期相同。这使您能够防止引用循环,同时避免解开可选的需要(就像 weak 的情况一样)。
【解决方案2】:
Apple's documentation says:
然而,与弱引用不同的是,无主引用在以下情况下使用
另一个实例具有相同的生命周期或更长的生命周期。
在您上面的示例中,只要调用“Example()”,您的new 属性就会被释放(new 甚至对于一个属性来说都是一个糟糕的名称,即使只是一个演示 :-)。
所以在这里可以工作的是:
class Example {}
let oneExample = Example() // properties are strong by default
unowned let theSameExample = oneExample