PDA

Volledige versie bekijken : delete child na een RemoveChildAction


Thomaz
%Europe/Berlin %660 %2007, 15:50
Om het geheugen op te schonen wil ik graag componenten deleten na een RemoveChildAction() (State Transition).
Nu worden ze alleen verwijderd van de stage, maar bestaan ze nog in het geheugen, dat daardoor vol loopt.

Kan iemand me de juiste richting wijzen?
Ik heb gekeken naar de creationPolicies, delete ed. maar kan er verder weinig over vinden. Flex is nieuw voor me, dus ik zoek me rot ;)

TheDutch
%Europe/Berlin %703 %2007, 16:53
Na een removeChild() zet ik de child altijd nog op "null" om te zorgen dat hij volledig uit het geheugen is:

this.removeChild(view);
this.view=null;

Thomaz
%Europe/Berlin %723 %2007, 17:21
Zoiets had ik inderdaad al geprobeerd. Maar werkt dat alleen bij dynamische States?

Mijn xml:

<mx:AddChild position="lastChild">
<catalogus:allCatReleases x="0" y="0" width="570" height="480" id="allCats" />
</mx:AddChild>

Nu wil ik dus "allCats" deleten uit het geheugen wanneer de State weer naar zijn begin-state gaat.
Met een functie kan ik dan dit niet doen: this.allCats = null;
Dat komt omdat "allCats" tijdens 'compile-time' nog niet bestaat en Flex geeft daar dan een error op.

Dit heb ik ook geprobeerd, maar werkt ook niet:
<catalogus:allCatReleases x="0" y="0" width="570" height="480" id="allCats" removedFromStage="this.allCats = null" />

TheDutch
%Europe/Berlin %727 %2007, 17:27
gebruik de property event.currentTarget met je removed of removedFromStage event :).

Thomaz
%Europe/Berlin %771 %2007, 18:30
gebruik de property event.currentTarget met je removed of removedFromStage event

Dat is wel vreemd, dat werkt niet zo heel fijn:
... removedFromStage="trace('removed');" ...
Wanneer ik het bovenstaande debug, zie ik dat de "removeFromStage" zowel bij een "add" als een "remove" wordt getriggered.
Ik denk dat ik het even helemaal op een andere manier aan moet pakken.
Maar tips zijn altijd welkom! Bedankt zover!

TheDutch
%Europe/Berlin %858 %2007, 20:36
Ik heb er eens over na zitten denken en mijn vorige bericht slaat nergens op :).

Wat ik zou doen is tracen wanneer het object nog wel en wanneer het object niet meer bestaat. Ook is het belangrijk om te weten dat de Garbage Collection van AS 3 pas zijn werk doet op het moment dat je de laatste reference van een object verwijderd met "delete". Ik ben er nog niet achter hoe je AS 3 op een nette manier opdracht kan geven een object en alle references in één keer kunt verwijderen zodat de Garbage Collection direct in werking kan treden.

Interessant punt om over na te denken en wellicht een eigen manager voor te schrijven wanneer het één en ander wat duidelijker is.

Wanneer ik meer weet hoor je het van me :).

Thomaz
%Europe/Berlin %460 %2007, 11:02
Maar dat is in AS2 ook al zo:
mijnView = null; trace(mijnView); -> null
delete mijnView; trace(mijnView); -> undefined

Blijkbaar moet je in AS3 ook alle event-referenties van een object deleten met "removeEventListener".
De Garbage Collection is in iedergeval wat ik zoek, dus daar ga ik eens even flink mee aan de slag. Bedankt!

Thomaz
%Europe/Berlin %448 %2007, 10:45
Ok: het is niet mogelijk om een Child uit een State of Viewstack te deleten. Dat kan alleen met losse objecten en modules...

TheDutch
%Europe/Berlin %506 %2007, 12:08
Mag ik vragen hoe je tot deze conclusie bent gekomen? :)

Thomaz
%Europe/Berlin %608 %2007, 14:36
Dat heb ik aangenomen van een Flex ontwikkelaar die er al een lange tijd mee werkt ;)
Zelf vind ik het ook erg logisch omdat er in alle help-files nergens terug te vinden is dat child-objecten compleet verwijderd kunnen worden.
Maar objecten die dynamisch zijn aangemaakt of ingeladen, die kunnen wel compleet verwijderd worden. Dat is wel terug te vinden in de help-files.

Zelf vind ik de modules erg interessant (vanaf versie 2.0.1), dus ik ga daar zeker naar kijken.