• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02-03-2009, 00:56   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2009
Beiträge: 99
removeChild Verständnisfrage

Hallo!

Mal eine Verständnis-Frage:

nehmen wir an ich mache folgendes:

addChlid(container);
container.addChild(nochEinContainer);
nochEinContainer.addChild(bild1);
nochEinContainer.addChild(bild2);
nochEinContainer.addChild(bild3);

und habe noch einen Timer innerhalb von nochEinContainer laufen, welcher noch nicht zu Ende ist und mache dann

removeChild(container)

Was passiert dann genau? Sind dann alle Child und "Unter-Childs" und Tmer etc inklusive "container" und allem "gelöscht"? Also der Timer auch weg, alles aus dem SPeicher raus etc? Mir macht das nämlcih derzeit echt Probleme.

Danke für die Aufklärung!

...Malo
MaloRox ist offline   Mit Zitat antworten
Alt 02-03-2009, 01:04   #2 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.184
removeChild(container) entfernt container mit allen untergeordneten Objekten aus der DisplayList. Der Timer läuft weiter, container wird nur nicht mehr auf der Bühne angezeigt.

In AS3 besteht der Flashplayer aus zwei Teilen:
1. ActionScript Virtual Machine (AVM)
2. Rendering Engine (DisplayList, Stage)

mit new Sprite() wird ein Sprite in der AVM erstellt. addChild() fügt Sprite dann nur noch der DisplayList hinzu.


P.S.: sowas kann man übrigens ganz einfach selber ausprobieren, hab ich eben auch gemacht, damit ich keinen Müll schreibe!
P.P.S.: Haha, ich hab gerade mal nachgesehen, was Sprite eigentlich heißt: Elfe, Kobold, Wicht
__________________
EDV = Ende Der Vernunft

Geändert von hmpf (02-03-2009 um 01:15 Uhr)
hmpf ist offline   Mit Zitat antworten
Alt 02-03-2009, 06:25   #3 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Wenn du keine anderen Referenzen auf eines der Objekte hälst und es keine EventListener mehr gibt, dann werden die bei Zeiten Garbage collected. Der Timer hat damit erstmal nichts zu tun.
Omega Psi ist offline   Mit Zitat antworten
Alt 02-03-2009, 21:15   #4 (permalink)
Home Flasher
 
Benutzerbild von Flash Doc
 
Registriert seit: Apr 2004
Ort: Engelskirchen
Beiträge: 345
Hallo,

mit removeChild() entfernt man ein DisplayObject von der Bühne, man nimmt es aus dem Anzeigestapel heraus. Trotzdem bleibt die Instanz noch ansprechbar. Man so eventuell vorgehaltene Dienste dieser Instanz nutzen oder aber Daten aus dieser Instanz auslesen.

Um sie also ganz zu entfernen, muss der entsprechenden Instanz auch noch der Wert null zugewiesen werden. Dann kann der GC sie aus dem Speicher entfernen und damit physikalisch vernichten.

Beispiel:
An einer Stelle hast du z.B. MovieClip-Instanzen angelegt und in den Anzeigestapel aufgenommen:
ActionScript:
  1. ...
  2. private function create():void {
  3.   var mcItem1:MovieClip = new MovieClip();
  4.   addChild(mcItem1);
  5. }
  6. ...

Beim Aufräumen (Zerstören) der Instanz, in welcher du die eben beschriebenen Instanzen erstellt hast, codierst du dann z.B. folgendes:
ActionScript:
  1. ...
  2. private function destroy():void {
  3.   removeChild(mcItem1);
  4.   mcItem1 = null;    // Diese Instanz zerstören. Der GC kann sie entfernen.
  5. }
  6. ...

Gruß vom Flash Doc
__________________
Erst Flash CS5 und dann Fläsch' Bier !!!
Flash Doc ist offline   Mit Zitat antworten
Alt 02-03-2009, 21:51   #5 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.184
Auch wenn es sich nach Klug*******erei anhört:
ActionScript:
  1. mcItem1 = null;    // Diese Instanz zerstören. Der GC kann sie entfernen.
  2.  
das ist nicht ganz korrekt. Dadurch wird nämlich nur der Verweis auf die MovieClip Instanz gelöscht, wodurch der MovieClip nicht mehr direkt ansprechbar ist, sofern es keine anderen Verweise gibt. Wenn der MovieClip einen EventListener (z.B. onEnterFrame) hat, läuft der EventListener weiter und der GC wird den MovieClip nicht einsammeln. Deshalb muß man darauf achten, daß man sauber alle Listener etc. entfernt, wenn man eine Instanz nicht mehr braucht. Und den Verweis sollte man als letztes entfernen, wenn der weg ist... doof.
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 03-03-2009, 00:43   #6 (permalink)
Neuer User
 
Registriert seit: Feb 2009
Beiträge: 99
aaah danke! ihr seid beide engel! das gab mein buch (wieder mal) nicht her
MaloRox ist offline   Mit Zitat antworten
Alt 27-03-2009, 11:42   #7 (permalink)
Neuer User
 
Registriert seit: Jul 2008
Beiträge: 117
Hallo!
Ich habe hier ein ähnliches Problem.
Ich füge meinen DisplayObjectContainer ein Objekt, einer selbst erstellten Klasse hinzu die von der MovieClip Klasse erbt.
In dieser Klasse definiere ich ebenfalls ein TimerObjekt, das die ganze Zeit durchläuft.
Wenn ich nun das Object von meinem DisplayObjectContainer mit removeChild() entferne, wird es zwar entfernt, jedoch läuft der Timer im Hintergrund weiter.

Auch das "Objekt = null" hat mir hier nicht weitergeholfen?
Muss ich hier den Timer extrig deaktivieren oder habe ich auch noch andre Chancen?
Besten Dank
Chris
Chris_Winters ist offline   Mit Zitat antworten
Alt 27-03-2009, 12:07   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Alle Listener entfernen und am besten auch interne Prozesse stoppen!
Omega Psi ist offline   Mit Zitat antworten
Alt 27-03-2009, 12:33   #9 (permalink)
Neuer User
 
Registriert seit: Jul 2008
Beiträge: 117
Und das geht wahrscheinlich nur händisch.
OK, ich habs mittlerweile auch so gelöst.
Chris_Winters ist offline   Mit Zitat antworten
Alt 27-03-2009, 15:58   #10 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.184
Ich glaube es ist üblich in selbst erstellten Klassen eine public function destroy() zu erstellen, die alle Listener entfernt usw.
Klar muß man alles "händisch" machen.
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 31-08-2009, 14:48   #11 (permalink)
Neuer User
 
Registriert seit: Sep 2003
Beiträge: 658
gibt es eigentlich eine möglichkeit, sich alle laufenden listener und deren listener-objekte, an denen sie kleben, anzeigen zu lassen?
headkit ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele