在Swift中,可以选择使用unowned
或weak
。为什么在使用weak
时使用unowned
?看起来两者几乎一样,weak
更安全。为什么使用无主时,你可以使用弱?
3
A
回答
8
Apple says的规则如下:
- 使用
weak
引用时,它是有效的,提及在其寿命期间的某个时刻成为nil
。 - 如果您知道在初始化过程中设置该引用永远不会为零,则使用无主引用。
其原因在首位具有unowned
是weak
必须是可选的类型,而unowned
将是非可选的。这样可以避免展开和/或检查,这与可选类型的变量相关联。
这两种引用都带有相同的花费:Swift跟踪它们,以便它可以设置weak
对nil
的引用,并且在引用的对象被销毁时标记为unowned
引用无效。
+0
“当参考被标记为无主时不需要做的事情”不正确。同样的事情必须用'无主的'引用完成。否则,他们如何保证当你访问一个解除分配的对象的'unowned'引用时它会导致运行时错误? – user102008
+0
@ user102008你是对的,他们必须跟踪这两种参考。我编辑了答案,谢谢! – dasblinkenlight
4
弱引用必须是可选的,因此您在使用它们之前始终确保它们不是nil
的行李和开销。另一方面,无主的引用不能是可选的,因此您可以保证它们始终存在,并且可以在不展开的情况下使用它们。
相关问题
- 1. 你什么时候可以使用uint_least16_t
- 2. 为什么你可以使用方法
- 3. 为什么使用泛型时,你可以使用类型
- 4. 你无法用Angular.js做什么,你可以用jQuery做什么
- 5. 为什么存在薄弱和无主权?为什么我们不能总是使用弱?
- 6. 为什么我会使用弱引用?
- 7. 你为什么使用T4?
- 8. 为什么在我可以在Erlang使用try catch时使用主管?
- 9. 为什么使用弱引用时ARC会自动释放?
- 10. 使残障人士可以使用CAPTCHA。你用什么方法?
- 11. 为什么要使用__attribute __((弱))和#pragma弱?
- 12. if(cin >> x) - 为什么你可以使用该条件?
- 13. 当您可以使用服务时,为什么会使用AsyncTasks?
- 14. 你可以用grep来做什么,你可以用egrep做什么?
- 15. 为什么使用主键?
- 16. 为什么你不能使用SQLite ROWID作为主键?
- 17. 当你使用Nunit的时候,你可以使用哪个Claus
- 18. 你可以使用GlVertexAttribPointer无着色
- 19. 我什么时候可以使用Task.Yield()?
- 20. 什么时候可以使用filter_input()
- 21. 什么时候可以使用IORef?
- 22. 什么时候可以使用lodash.after()?
- 23. 我什么时候可以使用AppDomain?
- 24. 为什么可以使用的setTimeout( “1”)
- 25. 为什么可以使用setspn创建无效的服务主体名称(SPN)
- 26. 什么可以使用rakefiles?
- 27. 你使用什么文件格式为你的应用程序,为什么?
- 28. 你可以使用Lucene作为OODB吗?
- 29. 使用弱引用时可以实现NSFastEnumeration吗?
- 30. 你什么时候使用新方法?
我相信唯一的区别是弱必须是可选的,而无主不能,给你一个更清晰的语法,当你从弱的安全是无关紧要的,指针得到清理是一个错误。 –
我投票重新提出这个问题。我不认为这应该作为一个重复被关闭。另一个问题是询问*这些参考文献是什么,而这个问题询问*为什么会使用其中一个,而另一个提供额外的安全性。 – dasblinkenlight