【问题标题】:Destroy an circular-reference instance in typescript?销毁打字稿中的循环引用实例?
【发布时间】:2016-11-26 14:39:24
【问题描述】:

假设我有如下代码:

class A {
    b: B;
    constructor() {
        this.b = new B(this);
    }
}

class B {
    a: A;
    constructor(a: A) {
        this.a = a;
    }
}
let a= new A()

当我想销毁 a 的实例时:

1我应该只是

a=null; 

a.b.a=null;
a=null;

?

2 有什么方法可以编写代码来测试结果吗?说一些代码来检测内存中某个类的实例号?

【问题讨论】:

  • 如果没有引用 a 或 b 它将被垃圾收集器标记为不可访问并一起清理,您无需执行任何操作。
  • @toskv 所以如果只引用a,当我使用a=null。即使 a 和 b 被循环引用, b 也会自动被 gc 引用?
  • 是的,只要没有其他人引用它们。
  • 您可以在 MDN 页面上了解更多关于 javascript 垃圾收集的信息。请记住,实际实现可能会有所不同。 developer.mozilla.org/en-US/docs/Web/JavaScript/…

标签: typescript memory-leaks circular-reference


【解决方案1】:

如果没有对 a 或 b 的引用,垃圾收集器会将其标记为不可访问并一起清理,您无需手动执行任何操作。

您可以在 javascript here 中找到有关垃圾收集器如何工作的更多信息。

【讨论】:

  • 在上面的示例中,DOM 元素“myDivElement”在“circularReference”属性中具有对自身的循环引用。如果该属性没有被显式删除或为空,则引用计数垃圾收集器将始终保持至少一个完整的引用,并且即使该 DOM 元素已从 DOM 树中删除,也会将其保留在内存中。如果 DOM 元素包含大量数据(如上例中的“lotsOfData”属性所示),则这些数据所占用的内存将永远不会被释放。
  • 这是您发送的链接中的引用,您确定它像您说的那样有效吗?我认为文档中的解释很模糊
  • @Esqarrouth 没有 JS 引擎使用引用计数。甚至 IE6 和 7(它们早就死了!)只有在 DOM 对象参与循环时才会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2019-02-22
  • 2019-02-19
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
相关资源
最近更新 更多