|
In ActionScript 2, movie clipurile se afla in stransa legatura cu timeline-ul din Flash. Daca au fost create intr-un timeline, acela va fi singurul timeline in care vor putea exista pana vor fi indepartate la final, fie de catre timeline (pe baza informatiilor din frame-uri), fie de catre codul Action Script, prin apelarea metodei removeMovieClip().
In AS2, referintele la movie clip-uri sunt referinte soft ce utilizeaza o cale pentru a conecta o instanta a unui movie clip cu timeline-ul parinte. In cazul in care calea catre un movie clip nu mai este valabila (fie a fost sters din timeline, fie nu exista la momentul respectiv), variabila care se refera la el nu va returna nici o valoare. Ca sa intelegi mai bine aceste notiuni, analizeaza urmatorul exemplu:
var mcRef:MovieClip;
trace(mcRef);
trace(typeof mcRef);
mcRef = attachMovie("mySymbol", "mySymbol", 1);
trace(mcRef);
trace(typeof mcRef);
mcRef.removeMovieClip();
trace(mcRef);
trace(typeof mcRef);
attachMovie("mySymbol", "mySymbol", 2);
trace(mcRef);
trace(typeof mcRef);
Dupa ce movie clip-ul a fost indepartat de pe ecran, variabila mcRef care se refera la acesta continua sa fie de tipul movieclip. Cand este creat un nou movie clip, la o adancime diferita, dar cu acelasi nume (deci aceeasi cale) ca si originalul, mcRef pointeaza catre acel nou clip video, deoarece a gasit o instanta valida pentru calea respectiva.
ActionScript 3 este mai putin criptic. Obiectele nu sunt atat de dependente de timeline-ul lor, putand fii mutate dintr-un timeline in altul prin apelarea metodelor addChild, removeChild, si alte functii similare. Sunt create acum asemeni tuturor celorlalte obiecte, utilizand cuvantul cheie new (in loc de attachMovie). Astfel, variabilele care fac referire la instantele obiectelor afisate functioneaza la fel cu celelalte, insemnand ca daca doresti sa scapi de instanta unui obiect afisabil din memorie, trebuie sa te asiguri ca nu exista referinte catre aceasta.
Cu ce a fost inlocuita functia removeMovieClip in AS3?
De exemplu, poti indeparta o instanta a unui movie clip (sau a unui alt obiect afisabil) destul de usor utilizand removeChild. Daca te afli in cadrul instantei, ar trebui sa utilizezi:
parent.removeChild(this);
Oricum, aceasta functie nu va indeparta instanta din memorie, ci doar de pe ecran , pentru a nu fi vazuta de catre utilizator. Daca doresti sa stergi un movie clip din memorie, trebuie sa te asiguri ca nu mai exista referinte la el. Daca variabila respectiva este o proprietate a unui clase, ea trebuie initializata cu null, altfel trebuie stearsa cu functia delete.
classPropertyMcRef = null;
delete dynamicMcRef;
Ceea ce trebuie sa retii este ca, in AS3, un obiect nu se poate sterge singur, ci el poate fi indepartat doar de catre parintele, de obiectul care l-a creat sau de timeline-ul care il contine.
Cu alte cuvinte, un obiect nu este responsabil pentru existenta sa proprie, ci sarcina de a verifica daca el exista revine parintelui. In acest mod, un obiect ce creeaza o instanta a unui alt obiect va controla si referinta catre copilul sau. Astfel, referintele sunt pastrate in cadrul aceluiasi obiect-parinte, fara a fi raspandite si in alte instante, ceea ce ajuta cu atat mai mult daca un obiect-copil trebuie sters la un moment dat. Clasa respectiva poate pastra toate referintele, poate sterge o instanta de pe ecran daca este nevoie, si poate anula toate referintele pentru a indeparta obiectul din memorie.
Desigur, o alta varianta ar fi sa nu utilizezi referinte. Daca instantele movie clip-urilor de pe scena au nume unice, ele pot fi accesate prin proprietatea name. Astfel, poti obtine o referinta la un obiect daca apelezi getChildByName("numeInstanta"). Aceasta metoda simpla poate inlocui variabilele ce pastreaza referinte la obiecte. In acest mod, apelul removeChild(getChildByName("instanceName")) este suficient pentru a sterge un obiect de pe ecran si din memorie.
|