Avatar billede f5 Nybegynder
16. december 2004 - 16:36 Der 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????

VH
/M
Avatar billede barklund Nybegynder
16. december 2004 - 16:41 #1
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 :)

--
Morten Barklund
Avatar billede f5 Nybegynder
16. december 2004 - 16:54 #2
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?
Avatar billede barklund Nybegynder
16. december 2004 - 17:00 #3
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.

--
Morten Barklund
Avatar billede f5 Nybegynder
21. december 2004 - 14:57 #4
Hej Morten,
Tak.

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?

/M
Avatar billede barklund Nybegynder
21. december 2004 - 15:17 #5
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.
Avatar billede barklund Nybegynder
21. december 2004 - 15:17 #6
RVSA
Avatar billede barklund Nybegynder
21. december 2004 - 15:18 #7
Æv, de går altid i stykker, når jeg smider dem :/
Avatar billede f5 Nybegynder
21. december 2004 - 15:22 #8
takker!
Avatar billede barklund Nybegynder
21. december 2004 - 15:29 #9
Og tark for points ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Banedanmark

ERTMS Test Manager

Everllence

Data Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger en IT-supporterelev til lokal IT på Haderslev Kaserne

Riskpoint A/S (Riskpoint Solutions Limited)

Senior Developer