Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Fora: listener weak reference i garbage collection

[es] :: Flash :: Fora: listener weak reference i garbage collection

[ Pregleda: 815 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

StarCraft
Rančić Milan
Beograd

Član broj: 164837
Poruke: 441
*.dynamic.sbb.rs.



+3 Profil

icon Fora: listener weak reference i garbage collection17.03.2011. u 12:44 - pre 108 meseci
Opet jedna fora koja može da koristi a ne može da škodi ;)

Objašnjenje garbage collection-a u flešu (brisanje objekata):
"Objekat u flashu je obrisan onog trenutka kada se obrišu sve reference ka tom objektu", što u prevodu znači: ako u neku variablu sačuvate neki objekat, npr: var mcRef:MovieClip = myMc; i posle napišete mcRef = null; vi ste time obrisali referencu ka tom objektu i više ne možete da mu pristupite nikako. MAĐUTIM...

Tu dolazi na red famozni "garbage collection". Naime, taj objekat NIJE OBRISAN iz memorije (još uvek) iako više ne postoji referenca ka njemu. Nego flash povremeno (kad procesor ima vremena, ili ako se memorija pre-napuni) krene da proverava redom reference ka svim objektima, i ako ustanovi da neki bojekti u memoriji "vise", onda ih obriše definitivno ("pokupi đubre").
Tako se dešava da, ako je objekat u sebi imao neke tajmere da recimo radi nešto na svakix x sekundi, taj objekat će interno sam za sebe i dalje nastaviti da to otkucava sve dok ga garbage collection ne skonta. Nažalost, developeri nemaju nikakvu kontrolu nad grabage collectorom. Ne postoji metoda da vi izričito kažete flashu "aj sad pokupi đubre" nego morate da čekate na taj random trenutak da to flash sam odradi. Zato potoji ono smaranje sa removeEventListener-ima, jer ako ih ne uklonite sve, objekat će večno ostati u memoriji ako ga "sluša" bilo koji objekat (koji nije obrisan).

E sad, druga fora koju sam xteo da podelim sa vama jeste "listener weak reference". Kada radite addEventListener() tamo poslednji parametar koji možete da dodelite jeste weak reference. Evo definicija iz dokumentacije:

addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false);

useWeakReference je po defoltu false. Međutim ako stavite true i ustanovi se da je objekat garbage collectovan, svi weak reference listeneri ka tom objektu će automatski biti uklonjeni(!) Ovo je odlična fora (samo) za slučaj da ste negde zaboravili da uklonite neki listener. Međutim, i dalje se preporučuje da sve listenere ipak uklanjate ručno, osim ako niste baš neki lazy programer :)
Čovek se onda zapita "zašto useWeakReference nije po defoltu true"? pa zato što postoji caka: Ako instancirate neki objekat kao lokalnu promenljivu, na kraju toka te funkcije automatski će te izgubiti referencu ka toj lokalnoj a samim tim i ka tom objektu. E, ako TU stavite weak reference, onda niste ništa uradili. :)

Primer:
Code:
function primer() {
    var ldr:Loader = new Loader();
    ldr.addEventListener(Event.COMPLETE, kadSeUcita, false, 0, true); // weak reference = true
}


Weak reference će vam u ovom slučaju pokvariti listener ka loaderu, koji može komotno da se stavi u lokalnu jer loader vam realno više i ne treba čim dobijete ono što on učitava.

www.zeitgeistmovie.com - film koji mora svako da vidi! (free to download)
 
Odgovor na temu

[es] :: Flash :: Fora: listener weak reference i garbage collection

[ Pregleda: 815 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.