我正在制作一个相当大的Flash项目,因此我担心内存使用情况。在应用程序的每个部分的末尾,我删除了包含内容的首要父元素。虽然这会移除父节点,但是这也会释放其中包含的每个子节点的内存,还是应该在删除父节点之前运行迭代来删除它们?
如果我没有表达我想要的内容,我会给出更多解释:
addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);
使用此代码:
removeChild(movie1);
它是从内存中删除movie2和movie3还是仍然存储,只是取消链接?
答案 0 :(得分:3)
如果另一个对象不再引用movie2
和movie3
,则应该对它们进行垃圾回收。这同样适用于movie1
。
来自Creating visual Flex components in ActionScript :
以编程方式删除控件, 你可以使用removeChild()或 removeChildAt()方法。你也可以 使用removeAllChildren()方法 从a中删除所有子控件 容器。调用这些方法可以 实际上并没有删除对象。如果 你没有任何其他参考 对于孩子,Flash Player包含它 在一些未来的垃圾收集 点。但是如果你存储了一个引用 对某个对象的孩子, 孩子不会从记忆中移除。
答案 1 :(得分:1)
嗯,到目前为止,内存中没有任何内容被删除,这实际上取决于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 }
答案 2 :(得分:0)
当然,它会删除所有3个。
儿童电影1有两个孩子,电影2 + 3。 如果因为某些实例死亡而死亡,孩子们也可能会死亡。
也许我错了,但你也可以尝试:
trace(movie2);