为什么通过使用局部变量弱化强引用不起作用?

问题描述

(我了解 ARC 的工作原理以及 weakunowned 之间的区别。问题是关于它们的具体用途以及为什么它不起作用。我将使用 {{1} } 在下面的例子中只是为了简单起见。)

请参见下面的示例。注意第 10 行,它旨在将传递的强引用更改为无主​​引用。我认为这会奏效,但最近在我的代码中使用它时,我发现我错了。

unowned

在 Playground 中运行上述代码。结果显示没有调用deinit,说明字典中保存了对该对象的强引用。

不知道为什么? 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()) weak 关键字是否仅适用于属性?但是上面的代码不会产生编译器错误,而且 Swift book 确实提到它可以用于变量声明:

您可以通过放置 unowned 关键字来指示无主引用 在属性或变量声明之前。

谁能分享一下你是怎么理解的?谢谢!

顺便说一句,我知道如何解决这个问题(例如,使用像 this 这样的包装器)。我试图理解的是为什么上面的代码不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)