2010-09-17 67 views
2

我正在做一個相當大的Flash項目,所以我關心內存使用情況。在應用程序的每個部分的末尾,我刪除了包含內容的全局父元素。雖然這會刪除父項,但是這是否也爲這個項目中包含的每個子項釋放內存?或者是否應該在刪除父項之前運行迭代來刪除這些項?刪除AS3中的父項:是否釋放所有子項使用的內存?

的情況下,我不表達什麼,我想我會給多一點的解釋:

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

通過使用此代碼:

removeChild(movie1); 

它與刪除電影2和MOVIE3內存還是仍然存儲,只是取消鏈接?

回答

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 
} 
+0

所以答案是肯定的,如果我想從內存中完全刪除它,我必須刪除所有的子元素,然後它是父元素,以保持應用程序的緊密度 – 2010-09-18 00:27:40

+1

如果movie2&movie3未被任何其他對象引用,則刪除movie1就足夠了。看代碼!在另一個方法()我只刪除movieN&在getOut()movieN不再被引用,所以三個movieclip將被垃圾收集 – PatrickS 2010-09-18 02:01:34

0

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

3

如果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

相關問題