Czy Dart jest wystarczająco inteligentny, aby automatycznie usuwać zmienne? Na przykład w następującym kodzie

class Foo {
 final streamController = StreamController<int>.broadcast();
 final textController = TextEditingController();
}

Muszę ręcznie zadzwonić textController.dispose() i streamController.close()

0
WebMaster 23 listopad 2020, 11:19

1 odpowiedź

Najlepsza odpowiedź

Dart jest zebranym śmieciami. Jeśli obiekt nie może być dostępny dowolnym kodem, jeśli nie ma znaczenia dla programu, czy istnieje, czy nie, wartość może ostatecznie zostać zebrana śmieci. To koniecznie będzie całkowicie niewidoczne dla programu, jest to tylko optymalizacja pamięci , aby nie zachować rzeczy, których nie ma różnicy.

Niezależnie od tego, czy obiekt jest w rzeczywistości nieosiągalny / śmieci, zależy od tego, czy program lub System czasu wykonywania utrzymuje osiągalny odniesienie do niego, bezpośrednio lub pośrednio. Niektóre obiekty są żywe przez system czasu wykonywania. Na przykład, otwarty plik wymaga zapamiętania, aby system mógł go zamknąć i zwolnić zasób, gdy program się kończy, czy kod pamięta go, czy nie. Ogólnie rzecz biorąc, alokowany zasób systemowy powinien być zawsze zobowiązany do żywych w jakiś sposób, i musisz pozbyć się / zamknąć / anulować, aby upewnić się, że jest zwolniony.

Dart robi nie Spróbuj zgadnąć, czy jedna zmienna obiektu jest nieosiągalna, gdy sam obiekt jest osiągalny. W danym przykładzie, jeśli instancja obiektu Foo jest dostępna, więc są wartościami jego zmiennych. (Jeśli istnieje dosłownie żadne odniesienia do foo.streamController w dowolnym miejscu w programie, w tym za pomocą dynamic, zmienna ta może być zoptymalizowana przez kompilatora, ale nie polegałbym na niego).

Jeśli nie ma odniesienia do obiektu Foo, to czy wartości zmiennych są zebrane na śmieci, zależy od tego, czy istnieją inne odniesienia do nich. Zakładam, że nie trzymasz ich wokół siebie, więc pytanie brzmi, czy są one pamiętani przez system czasu wykonywania.

Nie mogę mówić o TextEditingController. Zgaduję, że to trzepotnie. Nie wiem, czy zawiera zasoby systemowe.

Regulator strumienia jest utrzymywany tylko tak długo, jak jego strumień lub słuchacze strumienia. Jeśli nie ma obecnych słuchaczy na kontrolerze, a nikt nie zapisał foo.streamController.stream} w dowolnym miejscu, nie będzie żadnych odniesień do sterownika. Nawet jeśli są słuchacze, StreamSubscription S, a następnie, jeśli te subskrypcje nie są osiągalne, kontroler również nie jest ". (Jedynym wyjątkiem może być, gdy nowa zdarzenie zostało niedawno dodane do kontrolera, a zegar system został ustawiony, aby dostarczyć zdarzenie wkrótce później, ale to tylko na bardzo krótko).

3
lrn 23 listopad 2020, 09:58