为什么我不能给一个无主的常数一个初始值?

时间:2018-01-24 01:16:39

标签: ios swift automatic-ref-counting unowned-references

class Example {}
unowned let first = Example()

这会产生错误:

Attempted to read an unowned reference but object 0x60c000005f20 was already deallocated

我试图深入了解关键字unowned的确切含义。

2 个答案:

答案 0 :(得分:4)

来自The Swift Programming Language

  

就像弱引用一样,无主引用并不会强烈保留它引用的实例。

您创建了Example的新实例,并将其分配给您的无主常量first。没有任何内容强烈引用您的Example实例,因此会立即取消分配。您的无主常量first现在持有对此已释放对象的引用,因此您会收到尝试读取已释放对象的错误。

unowned关键字用于创建对象的弱引用,您可以保证引用对象的生命周期与引用对象相同。这使您可以防止引用循环,同时避免需要打开可选项(如weak的情况)。

答案 1 :(得分:0)

Apple's documentation says

  

与弱引用不同,当使用无主引用时   另一个实例具有相同的生命周期或更长的生命周期。

在你的例子中,只要" Example()"被叫,你的new属性被释放(new即使是属性也是一个可怕的名字,即使只是为了演示:-)。

那么可以在这里工作的是:

class Example {}
let oneExample = Example() // properties are strong by default
unowned let theSameExample = oneExample