删除AS3中的父项:是否释放所有子项使用的内存?

问题描述:

我正在做一个相当大的Flash项目,所以我关心内存使用情况。在应用程序的每个部分的末尾,我删除了包含内容的全局父元素。虽然这会删除父项,但是这是否也为这个项目中包含的每个子项释放内存?或者是否应该在删除父项之前运行迭代来删除这些项?删除AS3中的父项:是否释放所有子项使用的内存?

的情况下,我不表达什么,我想我会给多一点的解释:

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

通过使用此代码:

removeChild(movie1); 

它与删除电影2和MOVIE3内存还是仍然存储,只是取消链接?

好吧,到目前为止没有任何内容被从内存中删除,这实际上取决于如何引用movie1。比方说,稍后在应用程序中想要再次添加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 
} 
+0

所以答案是肯定的,如果我想从内存中完全删除它,我必须删除所有的子元素,然后它是父元素,以保持应用程序的紧密度 – 2010-09-18 00:27:40

+1

如果movie2&movie3未被任何其他对象引用,则删除movie1就足够了。看代码!在另一个方法()我只删除movieN&在getOut()movieN不再被引用,所以三个movieclip将被垃圾收集 – PatrickS 2010-09-18 02:01:34

Ofcourse它会删除所有的3

儿童电影1的有两个孩子,电影2 + 3 如果他死了,因为某些情况下死亡的孩子会possibily太死。

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

trace(movie2); 
+0

这不是必要的,因为它们总是可以被另一个对象引用,所以被删除。 – splash 2010-09-17 09:53:47

+0

我不认为执行'trace(movie2);'是相关的,因为你不知道什么时候垃圾回收器会运行并且“删除”movie2。 – David 2010-09-17 09:54:43

如果movie2movie3没有被另一个对象引用了,他们应该是垃圾收集。这同样适用于movie1

Creating visual Flex components in ActionScript

以编程方式删除一个控制, 可以使用removeChild()或 removeChildAt()方法。您也可以使用removeAllChildren()方法 来 从 容器中删除所有子控件。调用这些方法 并不实际删除对象。如果 您没有任何其他引用 给孩子,Flash Player将它包含在 垃圾回收中,在某些未来的 点。但是,如果您在某个对象上将参考 存储到该子项,则不会将内存中的 子项除去。

+0

我同意,并强烈建议下载并观看演示文稿,您可以在这里找到:http://blogs.adobe.com/aharui/2007/03/garbage_collection_and_memory.html。它有点老,但很好地解释了垃圾收集机制。 – David 2010-09-17 10:00:08