【问题标题】:Childs and parents and the famous garbage collector in actionscript-3孩子和父母以及 actionscript-3 中著名的垃圾收集器
【发布时间】:2009-08-27 12:26:48
【问题描述】:

又是一个关于 actionscript-3 中的垃圾收集器的问题:

如果我有一个主容器:

var masterContainer:Sprite = new Sprite();

然后我在这个容器中添加一个孩子:

var childImage:Sprite = new Sprite();
masterContainer.addChild(childImage);
addChild(masterContainer);

然后,我决定让垃圾收集器收集主容器及其所有内容,这样就足够了吗?

removeChild(masterContainer);
masterContainer = null;

或者我是否必须将所有子图像的引用存储在某个地方,以便以后能够从主容器中删除它们的子图像?

另外,是否可以让垃圾收集器在删除某些内容时记录一条消息,以及删除的具体内容是什么?也许是某种事件?

【问题讨论】:

    标签: actionscript-3 garbage-collection parent-child


    【解决方案1】:

    你问题的第一部分:

    从技术上讲,这就足够了。虽然这取决于副作用。如果您有非弱侦听器,则不会进行 GC。

    第二部分:

    您可以将要监视的对象作为弱键来使用字典。然后运行一个计时器,看看它什么时候被删除。

    【讨论】:

    • “如果你有非弱的监听器,那么什么都不会被 GCed”。我不同意。只要您正在侦听的对象符合 GC 条件,您就可以附加强大的侦听器。 IE。这不适用于舞台、正在运行的计时器或由不可收集的对象引用的对象(因为它们正在使用中)。
    • 非弱侦听器将增加对象的引用计数,并阻止它符合 GC 条件。它永远不会被标记,因此当 GC 运行时它不会被清理。现在,如果您删除侦听器就可以了 - 但是当附加了该侦听器时,该对象具有非零引用计数,因此它不会去任何地方。
    • 很高兴在 Stackoverflow Joa 上见到你!
    • 布兰登,恐怕你错了。引用计数只是 GC 的一部分。您必须考虑用于遍历活动对象树的“根”GC 对象。人们经常忘记这一点并“检测泄漏”检查 System.totalMemory,所以他们认为他们有泄漏,而事实并非如此。如果您可以使用分析器,请使用分析器检查此示例(无论如何您都想这样做;)pastebin.be/20568
    • 您会看到当前 MySprite 实例的数量将会增加。但是如果你强制一个 GC 循环,那么在你移除 MySprite 之后所有的实例都会被释放。请注意,我不会删除硬引用的侦听器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2015-01-06
    • 1970-01-01
    • 2013-05-30
    • 2018-12-30
    相关资源
    最近更新 更多