【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2013-07-29
      相关资源
      最近更新 更多