(我了解 ARC 的工作原理以及 和 之间的区别weak
。unowned
问题是关于它们的特定用途以及为什么它不起作用。unowned
为了简单起见,我将在下面的示例中使用。)
请参见下面的示例。注意第 10 行,它旨在将传递的强引用更改为无主引用。我认为这会起作用,但是当我最近在我的代码中使用它时,我发现我错了。
1 import Foundation
2 class MyClass {
3 var uuid: UUID = UUID()
4
5 deinit {
6 print("Deinited!")
7 }
8 }
9 func test(_ d: inout [UUID:MyClass], _ o: MyClass) {
10 unowned let u = o // <- !
11 d[u.uuid] = u
12 }
13 var d = [UUID: MyClass]()
14 test(&d, MyClass())
在 Playground 中运行上述代码。结果显示没有调用 deinit,表明对对象的强引用保存在字典中。
我想知道为什么?weak
和关键字是否unowned
仅适用于属性?但是上面的代码不会产生编译器错误,而且 Swift书确实提到它可以在变量声明中使用:
您可以通过在属性或变量声明之前放置 unowned 关键字来指示无主引用。
谁能分享一下你是怎么理解的?谢谢!
顺便说一句,我知道如何解决这个问题(例如,使用这样的包装器)。我试图理解的是为什么上面的代码不起作用。