【问题标题】:Removing Parent in AS3: Does this free the memory used by all the children?在 AS3 中移除父级:这会释放所有子级使用的内存吗?
【发布时间】:2010-09-17 09:44:17
【问题描述】:

我正在制作一个相当大的闪存项目,因此我担心内存使用情况。在应用程序的每个部分结束时,我删除了包含内容的总体父元素。虽然这删除了父级,但这是否也释放了其中包含的每个子级的内存,还是我应该运行迭代以在删除父级之前删除那些?

如果我没有表达我想要的,我会给出更多解释:

addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);

通过使用此代码:

removeChild(movie1);

它是从内存中删除movie2和movie3还是它们仍然存储,只是取消链接?

【问题讨论】:

    标签: actionscript-3 removechild displayobject


    【解决方案1】:

    如果movie2 和movie3 不再被另一个对象引用,它们应该被垃圾回收。这同样适用于movie1。

    来自Creating visual Flex components in ActionScript :

    要以编程方式删除控件, 您可以使用 removeChild() 或 removeChildAt() 方法。你也可以 使用 removeAllChildren() 方法 删除所有子控件 容器。调用这些方法确实 实际上并没有删除对象。如果 您没有任何其他参考资料 对孩子来说,Flash Player 包含它 在未来的垃圾收集中 观点。但是如果你存储了一个参考 对那个孩子在某个物体上, 孩子不会从内存中删除。

    【讨论】:

    • 我同意,并强烈建议您下载并观看您可以在此处找到的演示文稿:blogs.adobe.com/aharui/2007/03/…。有点老了,但是很好的解释了垃圾回收机制。
    【解决方案2】:

    嗯,到目前为止,没有从内存中删除任何内容,这实际上取决于电影 1 的引用方式。假设稍后在应用程序中您要再次添加movie1,您应该会发现movie1 不仅还在,而且还包含movie2 和movie3。

    var movie1:MovieClip; 任何(); 另一个方法(); 函数whatever():void { 电影1 = 新电影剪辑(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); 电影1.addChild(电影2); 电影1.addChild(电影3); addChild(movie1); 无论如何(); } 函数whateverElse():void { //这里,没有垃圾回收,movie1存在于外面 //这个函数的作用域 removeChild(movie1); //现在你可以 试试这个(); //但是如果你这样做,你实际上是在杀死 movie2 和 movie3 ,因为 //它们没有在其他任何地方引用。 removeChild(movie1); 电影1 =空; //这会抛出一个错误,movie1 不见了! 试试这个(); } 函数 tryThis():void { //是的,它的所有内容都还在这里 addChild(movie1); } 函数另一个方法():无效 { var movieN:MovieClip = new MovieClip(); var movie2:MovieClip = new MovieClip(); var movie3:MovieClip = new MovieClip(); 电影N.addChild(movie2); 电影N.addChild(movie3); // 做所有你需要做的... // 然后 removeChild(movieN); 出去(); } 函数getOut():无效 { //没有movieN,movie2和movie3,生活继续 //等待垃圾回收 }

    【讨论】:

    • 所以答案是肯定的,如果我想完全从内存中删除它,我必须删除所有子元素,然后它是父元素以保持应用程序紧凑
    • 如果movie2和movie3没有被任何其他对象引用,删除movie1就足够了。看代码!在 anotherMethod() 中我只删除了 movieN & 在 getOut() 中不再引用movieN,所以这三个movieclip 将被垃圾回收
    【解决方案3】:

    当然,它会删除所有 3。

    儿童电影 1 有两个孩子,电影 2 + 3。 如果他因某些个体死亡而死亡,孩子们也可能会死亡。

    也许我错了,但你也可以试试:

    trace(movie2);
    

    【讨论】:

    • 没有必要删除,因为它们总是可以被另一个对象引用。
    • 我不认为执行 trace(movie2); 是相关的,因为您不知道垃圾收集器何时运行并“删除”movie2。
    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2011-02-02
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2019-08-29
    相关资源
    最近更新 更多