删除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 }
如果movie2
和movie3
没有被另一个对象引用了,他们应该是垃圾收集。这同样适用于movie1
。
从Creating visual Flex components in ActionScript:
以编程方式删除一个控制, 可以使用removeChild()或 removeChildAt()方法。您也可以使用removeAllChildren()方法 来 从 容器中删除所有子控件。调用这些方法 并不实际删除对象。如果 您没有任何其他引用 给孩子,Flash Player将它包含在 垃圾回收中,在某些未来的 点。但是,如果您在某个对象上将参考 存储到该子项,则不会将内存中的 子项除去。
我同意,并强烈建议下载并观看演示文稿,您可以在这里找到:http://blogs.adobe.com/aharui/2007/03/garbage_collection_and_memory.html。它有点老,但很好地解释了垃圾收集机制。 – David 2010-09-17 10:00:08
所以答案是肯定的,如果我想从内存中完全删除它,我必须删除所有的子元素,然后它是父元素,以保持应用程序的紧密度 – 2010-09-18 00:27:40
如果movie2&movie3未被任何其他对象引用,则删除movie1就足够了。看代码!在另一个方法()我只删除movieN&在getOut()movieN不再被引用,所以三个movieclip将被垃圾收集 – PatrickS 2010-09-18 02:01:34