在AS3中删除父母:这是否可以释放所有孩子使用的记忆?
-
03-10-2019 - |
题
我正在做一个相当大的Flash项目,因此我担心内存使用情况。在应用程序的每个部分的末尾,我删除了包含内容的总体父元素。尽管这删除了父母,但是否还可以释放其中包含的每个孩子的内存,还是我应该在删除父母之前运行迭代以删除这些记忆?
我会在案例中给出更多解释,我没有表达我想要的东西:
addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);
通过使用此代码:
removeChild(movie1);
它是从内存中删除Movie2和Movie3还是仍然存储,只是UNINK?
解决方案
好吧,到目前为止,没有从内存中删除任何东西,这实际上取决于如何引用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
.
要编程删除控件,您可以使用removechild()或removechildat()方法。您也可以使用RemoVeallChildren()方法从容器中删除所有子控制器。调用这些方法实际上并未删除对象。如果您没有对孩子的任何其他引用,则Flash Player在未来的某个点将其包含在垃圾收集中。但是,如果您在某个对象上存储了对该孩子的引用,则不会将孩子从内存中删除。
当然,它消除了所有3个。
儿童电影1有两个孩子,电影2 +3。如果因为某些情况而死亡,那么孩子也可能会死。
也许我错了,但您也可以尝试:
trace(movie2);
不隶属于 StackOverflow