Nie należy próbować usuwać obiektu z samego siebie - jest to zła praktyka, aw AS3 nie można tego zrobić na pewno.
Obiekt może zostać usunięty (to znaczy śmieci zebrane) tylko wtedy, gdy nie ma odniesień do tego obiektu. Ponieważ odniesienia zawsze są przekazywane przez wartość, a obiekt nie jest generalnie świadomy, które odniesienia do niego istnieją, nie można usunąć obiektu z samego siebie. Jedyną użyteczną rzeczą, jaką możesz zrobić, to stworzyć metodę, która wyczyści wszystkie zasoby używane przez instancję. Taka metoda będzie służyć jako destruktor, ale będziesz musiał ją wywołać ręcznie. Nie zapominaj, że detektory zdarzeń zapobiegają także czyszczeniu pamięci, chyba że je usuniesz.
Istnieje również różnica między delete
"a właściwością i ustawieniem jej na null
. Efektywnie delete
usunie właściwość z instancji klasy dynamicznej. Natomiast ustawienie wartości nieruchomości na null
nie spowoduje usunięcia nieruchomości, ale usunie wszelkie odniesienia tam przechowywane. W związku z tym obie akcje zniszczą referencję przechowywaną w niektórych nieruchomościach. Zauważ, że nie możesz delete
obiektu, tylko właściwość.
Istnieje kilka hacków, które mogą być użyte do rozpoczęcia zbierania śmieci w odtwarzaczach flash 9 i starszych. Jednak ostatnio dostępne jest połączenie System.gc()
, które robi to samo. Zauważ, że nie możesz naprawdę polegać na tym, że GC zostanie wywołany. To zależy od Flash Playera.
Powracając do pytania: Rzucanie wydarzenia i powiadomienie rodzica, że coś poszło nie tak, to naprawdę dobry pomysł. Powinieneś się tego trzymać. Co więcej, lepiej jest, jeśli rodzic będzie wiedział o takim wydarzeniu w ten sposób, a nie wtedy, gdy odkryje, że niektóre właściwości zostały magicznie anulowane.
P.S .: Czytanie Granta Skinnera articles on memory w Flash Playerze to naprawdę dobry pomysł.
"Należy zauważyć, że nie można usunąć obiektu, a jedynie właściwość." - Nie jestem pewien co masz na myśli. Co się stanie, jeśli moja własność jest przedmiotem? – Luke
@Luke: Mam na myśli to, że właściwość obiektu A może zawierać odniesienie do jakiegoś obiektu B, ale 'delete A.prop' usunie tylko tę właściwość wraz z odniesieniem. To znaczy. A nie będzie mieć własności "prop", ale prawdopodobnie będą tam gdzieś odniesienia do obiektu B. Więc B nie otrzyma GC. – dragonfly
'System.gc()' jest dostępny tylko dla wersji flash odtwarzacza. Powinieneś to poprawić, aby wspomnieć, że nie powinno się go używać do niczego innego niż debugowanie. –