[英]Doubly linked list in Swift: why is only one of the references declared weak?
class DoublyLLNode<T>{
var value<T>?
weak var prev: DoublyLLNode? = nil
var next: DoublyLLNode? = nil
}
为什么一个价值,无论是上一个还是下一个,都显得weak
? 我们难道不能让两者都变弱吗? 如果是,为什么? 如果没有解释。
如果两者都很弱,则不会对任何节点进行任何强引用,并且将释放所有节点。
当存在父/子关系时,您通常对父项中的子项具有强引用,并且子项对其父项具有弱引用。 想想next
的“孩子”和prev
“父”。
如果两者都很强,那么最终会有参考周期。
如果对对象有weak
引用,则可以随时取消分配该对象,包括在仍然保持对它的弱引用时。 如果对对象有strong
引用,则在强引用消失之前,不会释放该对象。
因此,如果链接列表中的所有项目仅具有彼此的弱引用,则在您使用它们时可以全部取消分配,因为没有对任何项目的强引用。
你也不能使两个引用都很强大。 您将创建一个称为强引用循环的东西。 这是两个对象通过强引用相互引用的时候。 因此,两个对象中的任何一个都不可能被释放(因为它们相互引用)并且你浪费了记忆。
在链表节点,你想引用(或者是一个next
或prev
参考)要坚强。 然后链表中的每个对象都有一个强引用。 如果next
引用很强,那么对于任何节点x
,节点x - 1
将具有对它的强引用(并且可能是使用链接列表的任何代码将具有对头部的强引用)。 如果prev
指针很强,那么对于任何节点x
,节点x + 1
将具有对它的强引用(并且你需要以某种方式确保对尾部有强引用...否则,尾部将被释放,然后是尾部前面的节点,并且一直打开直到所有节点都消失了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.