2011-01-20 12 views
5

Ostatnio odkryłem, że ciągle piszę na liście RemoveEventListeners wszędzie, co sprawia, że ​​kod jest dość brudny. Wiem, że to najlepsza praktyka i takie, ale ogólnie nie ma sensu. Garbage collector sam powinien sobie poradzić z tak prostym zadaniem, nieprawdaż? Czy trudno jest automatycznie usunąć wszystkie detektory, gdy obiekt ma wartość NULL?Action Script: Czy ustawienie obiektu na wartość null powoduje automatyczne usunięcie wszystkich dołączonych detektorów zdarzeń?

Po prostu chcę się upewnić, czy tak jest. Czy ustawienie obiektu na wartość null powoduje automatyczne usunięcie wszystkich podłączonych detektorów zdarzeń?

Wszelkie informacje na ten temat?

UPDATE: W moim przypadku jest to tak - ja utworzyć obiekt i dołączyć kilka detektorów zdarzeń do niego, a następnie po pewnym czasie trzeba ponownie zainicjować ten obiekt. Oczywiście ustawienie tego obiektu na wartość zerową jest znacznie łatwiejsze niż ręczne rozłączenie każdego słuchacza. I w większości słuchacze są anonimowymi funkcjami, co oznacza, że ​​nie jest to możliwe bez refaktoryzacji kodu. Kiedy po prostu ponownie zainicjuję zmienną nowa, nie otrzymuję duplikatów i takich, ale nie jestem pewien, czy to była poprzednia wartość, a wszyscy słuchacze zbierają śmieci. Czy to jest?

+2

Casalib to dobry zestaw klas, które pomogą uprościć zbieranie śmieci. Przydatne, gdy masz mnóstwo wyświetlanych obiektów. – redconservatory

+0

+1 dla casalib - http://as3.casalib.org/docs/org_casalib_display_CasaMovieClip.html sprawdź funkcję removeChildrenAndDestroy() – Daniel

Odpowiedz

4

Nie, nie ustawiasz obiektu na wartość null, ale wskaźnik, który się do niego odwołuje. Nie zostanie pobrane przez odśmiecanie, chyba że nie jest potrzebne w żadnej innej części programu, która obejmuje słuchaczy. Musisz sam usunąć wszystkich słuchaczy, ale to nie powinno powstrzymać cię od znalezienia mniej niechlujnego sposobu na zrobienie tego - jak dedykowana metoda clearListeners lub klasa pomocników, itp.

+0

Często próbuję implementować interfejs IDisposable dla każdej klasy, którą buduję. To zmusza mnie do zaopiekowania się implementacją kodu, który ułatwi proces usuwania śmieci. – OXMO456

+0

Zazwyczaj wzywam do usunięcia wszystkich słuchaczy za pomocą publicznej metody dispose(). – TheDarkIn1978

0

Uważam, że musisz użyć słabego odniesienia kiedy przypisujesz słuchaczy, a nie "zerowanie" powinno wystarczyć.

+0

To powinno działać pod warunkiem, że czyścisz sam siebie i usuniesz wszystkie odniesienia do obiektu. Ponadto, w niektórych sytuacjach, jeśli nie podasz wyraźnego odniesienia do obiektu, będzie to śmieci zebrane i wprowadzą nieoczekiwane zachowanie. – goliatone

+0

Słabe odwołania to parametr w funkcji 'addEventListener'. Na przykład 'stage.addEventListener (Event.ENTER_FRAME, loop, false, 0, true);'. Ostatnim parametrem "true" jest parametr "useWeakReference". Zawsze ustawiałem to na prawdziwe. –

+0

słabe referencje są mylące! Nauczyłem się twardej drogi, ale na szczęście Juan Pablo Califano zamieścił bardzo pouczające wyjaśnienie na moje poprzednie pytanie dotyczące zbierania śmieci. przeczytaj go: http://stackoverflow.com/questions/4200211/actionscript-forced-garbage-collection-not-working-in-adl – TheDarkIn1978

Powiązane problemy