PDA

Volledige versie bekijken : "delete object" lukt niet


spook1
%Europe/Berlin %928 %2007, 22:17
Ik probeer een instantie: dialogObj te verwijderen vanuit een dialogObj.methode zelf
Dat lukt niet.

In de methode Dialog.verwijderDialog()

zeg ik ergens, (nadat ik wat andere zaken heb geregeld):

delete dialogObj;
trace(dialogObj.toString() + "= niet verwijderd?? why not??");

Uit de trace die ik terugkrijg blijkt het object niet verwijderd te zijn.

Wat doe ik fout?
Is natuurlijk triviaal, maar voor mij nog even niet :-((
Daarom ben ik bij voorbaat al dankbaar als iemand even een tip kan geven

Laiverd
%Europe/Berlin %937 %2007, 22:30
Voor zover ik weet kan een obj.method() niet zichzelf verwijderen. Het probleem is ook wel eens ter sprake geweest binnen een class, waar iemand vanuit de class de instance van de class wilde verwijderen.

Ik ben de eerste om deze post weer te verwijderen mocht ik onzin hebben uitgekraamd :D
var plop = new Object();
plop.del = function(){
delete this;
}
trace(plop); // output: [object Object]
plop.del;
trace(plop); // output: [object Object]
delete plop;
trace(plop); // output: undefined

Voetsjoeba
%Europe/Berlin %037 %2007, 00:53
De delete operator verwijdert nooit echt een object. Het geeft enkel aan dat een bepaalde reference naar een object mag verwijderd worden. Deze verwijzingen zijn de variabelen die je gewoon alledaags gebruikt. Het eigenlijke object bestaat in het geheugen, en de variabele is slechts een verwijzing naar dat object. Neem nu:


taart = new Object();
taart.lekker = "yip";

Hier wordt een nieuw object aangemaakt in het geheugen, en taart wordt ingesteld als zijnde een verwijzing naar dat object. Na de declaratie taart = new Object(); kan taart dus worden gebruikt als reference naar het eigenlijke object in het geheugen. Als we nu zouden zeggen:


delete taart;


Dan wordt in eerste instantie de verwijzing van de variabele taart naar het eigenlijke object in het geheugen verbroken. Nu komt de garbage collector in het spel - deze zorgt er voor dat objecten in het geheugen die geen enkele verwijzing meer bezitten effectief worden verwijderd. Omdat taart de enige verwijzing was, wordt het object dus ook effectief verwijderd:


taart = new Object();
taart.lekker = "yip";
delete taart;
trace( taart ); //undefined


Bekijk nu dit voorbeeld:


taart = new Object();
taart.lekker = "yip";

vla = taart;
delete taart;

trace( taart + ": " + taart.lekker ); //undefined: undefined
trace( vla + ": " + vla.lekker ); //[object Object]: yip


De verwijzing vla wordt aangemaakt als een verwijzing naar hetzelfde fysiek object waarnaar taart verwijst. Als we nu delete taart uitvoeren, dan wordt de verwijzing van taart naar het object verbroken. Maar het object wordt nu niet verwijderd, omdat vla nog steeds een verwijzing ernaar is. Uit de trace is duidelijk dat vla hetzelfde object is als dat waar taart naar verwees.

Je kan dus vanuit een methode nooit een instance verwijderen, omdat er altijd een verwijzing naar de instance is die gebruikt wordt om de methode überhaupt te kunnen aanroepen en uitvoeren.


mijnInstance = new Object();
mijnInstance.doei = function(){
delete this;
}
mijnInstance.doei();
trace( mijnInstance ); //[object Object]


Het object kan nooit effectief verwijderd worden vanuit mijnInstance.doei, omdat de verwijzing mijnInstance die je hebt gebruikt om de methode doei van je instance aan te roepen altijd blijft bestaan.

spook1
%Europe/Berlin %368 %2007, 08:50
Reuze bedankt voor de uitgebreide antwoorden.
Ik was al bang dat er zoiets aan de hand was.

Ik moet dus, net zoals ik een object van buiten de Class aanmaak (new Object) het object ook weer van buiten class verwijderen.

Nu vraag ik me af hoe dat handig kan.

Ik maak een dialoogObject aan. Hierdoor wordt een dialoog getoond, zoals in adventure games vaak voorkomt.
Als de speler de dialoog heeft "uitgespeeld", moet deze worden verwijderd omdat er anders veel te veel dialogen bestaan na verloop van tijd.

Is er geen enkele manier om vanuit de Class (daar zie je namelijk dat de dialoog is voltooid) het dialoogObject te verwijderen?

Ik zie nu als mogelijkheid dat ik het dialoogObject een property: "finished" meegeeef, en vanuit een enterframe event blijf checken "of het al zover is".
dat lijkt me ook een kostbare oplossing, cpu technisch gezien...

Kan ik vanuit het object een event genereren dat een ander object (Opruimer bv) triggert om het op te ruimen?
In dat geval loont het wel om een Opruimer te bouwen, daar heof ik er maar een van te hebben en die kan dan alle gebruikte objecten opruimen gedurende de hele game.

Wat is de good-practice in dit geval?