16. december 2004 - 16:36Der er
8 kommentarer og 1 løsning
Keylistener cache problem
Jeg har et underligt cache problem med keylisteners. Har lavet en lille test:
Jeg har en swf film som opretter en keylistener og giver mig en simple trace så jeg kan se den fungere. Jeg har så en anden swf film med to knapper: en som loader swf'en med keylisteren ind på level 1 og en som unloader den.
jeg loader min film ind, trykker på min key og får min trace. Efter jeg så unloader filmen, loader jeg den ind igen.
Når jeg nu trykker på en key, får jeg 2 traces ... den har altså ikke slettet den gamle listener da jeg unloaded filmen. Hvis jeg gør det en tredje gang får jeg 3 traces osv ...
Jeg skal bruge principet til et spil men kan simpelthen ikke komme uden om dette problem. Er der nogen som kan hjælpe????
Hvis du ikke siger Key.removeListener(some_object) så findes den selvfølgelig stadigvæk. Det er ret simpelt :)
Du bør altid i en sådan situation have en kill() funktion eller tilsvarende på dit objekt, som sørger for at fjerne "abonnement" på alle de ting, som der måtte være :)
Jeg kan faktisk godt se det nu...jeg trode at når filmen blev unloaded, blev alt hvad der tilhørt slettet. Men det gør hverken Key listeners eller setIntervals....De ligger i et andet scope eller?
Når du adder en Keylistener, så er det jo Key-objektet, der internt har et listener array af dem, der lytter. Og hvis der findes en reference til et objekt (eller funktion) et sted, der ikke er slettet - så forbliver objektet/funktionen i hukommelsen, selvom dens scope og så videre ikke findes.
Prøv for eksempel:
var f = createEmptyMovieClip("foo_mc", 1); f.bar = new Object(); f.bar.flaf = "hej"; t = f.bar; f.removeMovieClip(); trace(t.flaf); // stadig "hej"
Altså, selvom oprindeligt scope er slettet, virker objektet/funktionen stadigvæk.
Med setInterval virker det på samme måde. Du giver den en reference til din funktion, som den så gemmer lokalt - og hvis du ikke fortæller den, at den skal holde op med at huske lige denne funktion, ja så bliver den ved med at huske den. Man kan jo ikke "slette" objekter og funktioner - kun slette alle referencer til dem. Først da slår Flash's garbage collection ind.
For det første havde jeg lavet fjernet min keylistener ordentligt og får det andte vidste jeg ikke at setInterval blev hængende efter at hele levelen var fjerent. Det er løst nu - tak. Smider du ikke et svar?
Det er vigtigt at forstå, at funktioner ikke "bor" nogen steder - det lever kun i kraft af deres referencer og så længe der er referencer tilbage, lever funktionerne.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.