OB *_* OB 15 reference-counting circular-reference
使用引用计数时,有哪些可能的解决方案/技术来处理循环引用?
最着名的解决方案是使用弱引用,但是关于该主题的许多文章暗示也存在其他方法,但是不断重复弱引用示例.这让我想知道,这些其他方法是什么?
我不是问什么是引用计数的替代方法,而是使用引用计数时循环引用的解决方案是什么.
这个问题不是关于任何具体问题/实施/语言而是一般性问题.
多年来,我已经用十几种不同的方式查看了这个问题,我发现每次都能解决的唯一解决方案是重新构建我的解决方案,而不是使用循环引用.
编辑:
你能扩展吗?例如,当孩子需要了解/访问父母时,您将如何处理父子关系?- OB OB
正如我所说,唯一的好解决方案是避免使用这样的结构,除非你使用的运行时可以安全地处理它们.
也就是说,如果你必须有一个树/父子数据结构,孩子知道父母,你将不得不实现自己的,手动调用的拆解序列(即你可能实现的任何析构函数的外部)在根(或您想要修剪的分支)并对树进行深度优先搜索以从叶中删除引用.
它变得复杂和繁琐,因此IMO唯一的解决方案是完全避免它.
这是我见过的解决方案:
向每个对象添加一个方法,告诉它释放对其他对象的引用,比如调用它 Teardown()。
然后,您必须知道谁“拥有”每个对象,并且对象的所有者在处理完对象后必须对其调用 Teardown()。
如果有一个循环引用,比如 A <-> B,并且 C 拥有 A,那么当 C 的 Teardown() 被调用时,它调用 A 的 Teardown,它对 B 调用 Teardown,然后 B 释放对 A 的引用,然后 A 释放它对 B 的引用(销毁 B),然后 C 释放对 A 的引用(销毁 A)。
| 归档时间: |
|
| 查看次数: |
8705 次 |
| 最近记录: |