0
class Example {}
unowned let first = Example()

这会产生错误:

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

我正在尝试深入了解关键字的确切unowned作用。

4

2 回答 2

4

来自Swift 编程语言

与弱引用一样,无主引用不会对其引用的实例保持强控制。

您创建一个 的新实例Example,并将其分配给您的无主常量first。没有任何东西持有对您的Example实例的强引用,因此它会立即被释放。您的无主常量first现在持有对该已释放对象的引用,因此您会收到错误,即您正在尝试读取已释放对象。

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

于 2018-01-24T01:27:27.060 回答
0

苹果的文档说

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

在你上面的例子中,一旦Example()调用“”,你的new属性就会被释放(new即使是一个属性,这也是一个可怕的名字,即使只是一个演示:-)。

所以在这里可以工作的是:

class Example {}
let oneExample = Example() // properties are strong by default
unowned let theSameExample = oneExample
于 2018-01-24T01:25:18.607 回答