代码之家  ›  专栏  ›  技术社区  ›  Dan Hanly

在AS3中删除父级:这是否释放了所有子级使用的内存?

  •  2
  • Dan Hanly  · 技术社区  · 14 年前

    我正在做一个相当大的flash项目,所以我担心内存的使用。在应用程序的每个部分的末尾,我删除了保存内容的总体父元素。尽管这样做会删除父级,但这是否也会释放包含在其中的每个子级的内存,还是应该在删除父级之前运行一个迭代来删除这些子级?

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

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

    通过使用此代码:

    removeChild(movie1);
    

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   PatrickS    14 年前

    好吧,到目前为止,记忆中没有任何东西被移除,这真的取决于电影1是如何被引用的。让我们假设在稍后要再次添加movie1的应用程序中,您应该发现movie1不仅仍在这里,而且还包含movie2&movie3。

    var movie1:MovieClip;
    
    whatever();
    anotherMethod();
    
    function whatever():void
    {
        movie1 = new MovieClip();
        var movie2:MovieClip = new MovieClip();
        var movie3:MovieClip = new MovieClip();
        movie1.addChild(movie2);
        movie1.addChild(movie3);
        addChild(movie1);
    
        whateverElse();
    }
    
    function whateverElse():void
    { 
        //here, nothing is garbage collected, movie1 exists outside
        //the scope of this function
        removeChild(movie1);
    
        //now you can
        tryThis();
    
        //but if you do this you're effectively killing movie2 & movie3 , since
        //they're not referenced anywhere else.
        removeChild(movie1);
        movie1 = null;
    
        //this is going to throw an error , movie1's gone!
        tryThis();
    }
    
    function tryThis():void
    {
        //yes ,it's still here with all its content
        addChild(movie1);
    }
    
    function anotherMethod():void
    {
        var movieN:MovieClip = new MovieClip();
        var movie2:MovieClip = new MovieClip();
        var movie3:MovieClip = new MovieClip();
        movieN.addChild(movie2);
        movieN.addChild(movie3);
    
        // do all you need to do... 
        // then
        removeChild( movieN);
        getOut();
    }
    
    function getOut():void
    {
       //life goes on without movieN, movie2 & movie3
       //waiting to be garbage collected
    }
    
        2
  •  3
  •   splash    14 年前

    如果 movie2 movie3 不再被其他对象引用,它们应该被垃圾收集。同样适用于 movie1 .

    Creating visual Flex components in ActionScript :

    要以编程方式删除控件, 您可以使用removechild()或 removechildat()方法。你也可以 使用removeAllChildren()方法 从中移除所有子控件 容器。调用这些方法会 实际上不是删除对象。如果 你没有其他证明人 对孩子来说,flash player包括了它 在未来的垃圾收集中 点。但是如果你存储了一个引用 在某个物体上的那个孩子, 子项不会从内存中删除。

        3
  •  0
  •   Jordy    14 年前

    当然,它删除了所有3个。

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

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

    trace(movie2);