Frage

Ich mache ein ziemlich großes Flash-Projekt und so bin ich über die Speichernutzung betroffen. Am Ende eines jeden Abschnitts der Anwendung entferne ich das übergeordnete Mutterelement, das den Inhalt hält. Obwohl dieses Entfernen der Eltern, bedeutet dies auch den Speicherplatz frei, für jedes der Kinder in dieser enthalten sind, oder sollte ich eine Iteration ausgeführt werden, die vor dem Entfernen der Eltern zu entfernen?

Ich werde ein wenig mehr Erklärung in-Fall geben ich ausdrücken nicht, was ich will:

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

Mit diesem Code:

removeChild(movie1);

Ist es Film2 und Film3 aus dem Speicher zu entfernen, oder sind sie noch gespeichert sind, nur nicht verknüpft?

War es hilfreich?

Lösung

Nun, nichts wird aus dem Speicher entfernt, so weit, es hängt wirklich davon ab, wie movie1 verwiesen wird. Lassen Sie uns sagen, dass später in der Anwendung, die Sie movie1 wieder hinzufügen möchten, können Sie diese movie1 finden sollte hier noch nicht nur, sondern es enthält auch Film2 & Film3.

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
}

Andere Tipps

Wenn movie2 und movie3 werden durch ein anderes Objekt nicht mehr Bezug genommen wird, sollten sie Müll gesammelt werden. Das gleiche gilt für movie1.

Erstellen von visuellen Flex-Komponenten in Actionscript :

So entfernen Sie programmatisch eine Steuerung, Sie können die removeChild () verwenden, oder removeChildAt () -Methoden. Du kannst auch verwenden, um die removeAllChildren () Methode Entfernen Sie alle untergeordneten Steuerelemente von einem Container. diese Methoden aufrufen tut nicht wirklich die Objekte löschen. Wenn Sie haben keine andere Referenzen das Kind, enthält Flash Player in Garbage Collection in der Zukunft Punkt. Aber wenn Sie eine Referenz gespeichert zu diesem Kind auf einem Gegenstand, der Kind nicht aus dem Speicher entfernt.

Natürlich steht es der 3 entfernt.

Child Film 1 hat zwei Kinder, Film2 + 3. Wenn er stirbt, weil einige Instanz die Kinder versterben possibily sterben.

Vielleicht bin ich falsch, aber Sie können auch versuchen:

trace(movie2);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top