2013-12-09 4 views
4

Я хочу в основном удалить объект, который я создал. Как удалить объект?Как удалить объект в Dart?

Я проверил Object определение here, но не смог выяснить способ сделать это. Также мне любопытно, можем ли мы определить деструкторов или нет.

ОБНОВЛЕНИЕ Вопрос получает хорошие ответы. Но я хочу обратить ваше внимание на случай, когда я хочу удалить свои объекты или вызвать деструктор. Предположим, мы хотим создать темп, используя вы можете соединить прямоугольники через расположенные на нем порты. Поэтому идея состоит в том, чтобы иметь объект, который имеет ссылку на тело прямоугольника и порты, расположенные на двух концах. Фактически, для этого объекта могут потребоваться некоторые другие свойства, такие как [bool] selected или [bool] dragging или [List<RectElement>] connectedSquares. Например, когда пользователь выбирает прямоугольник и обращается назад, я хочу убедиться, что прямоугольники исчезли, а мой объект удален. Таким образом, этот прецедент может дать более глубокое понимание вопроса.

+2

Как я могу видеть в документах, вы этого не делаете. Сбор мусора ведет к недостижимым объектам, поэтому вам не нужно ничего с ними делать. (Основной побочный эффект: вы действительно * не можете ничего делать с ними, кроме запуска цикла GC, если среда выполнения предоставляет какой-то способ сделать это.) – cHao

ответ

7

Вам не нужно активно удалять объекты в Дарте.

Dart - это собранный мусором язык, поэтому любой объект, на который вы не ссылаетесь, в конечном итоге будет собран и освобожден от мусора системой времени выполнения.

Итак, все, что вам нужно сделать, это очистить любые переменные, которые вы ссылаетесь на объект.

Сбор мусора действительно подразумевается в спецификации языка. В спецификации не сказано, что сбор мусора существует (он даже не упоминает концепцию), но язык и библиотеки разработаны таким образом, что сбор мусора возможен: объекты, которые программа не может найти ссылку нигде и больше не влияет на поведение программы, поэтому невозможно обнаружить, что они собираются и удаляются сборщиком мусора.

1

Убедитесь, что вы не держите ссылку на объект, чтобы он мог быть GCed.

x = null; 
1

В настоящее время программы Dart развернуты как JavaScripts и поэтому ограничены моделью исполнения JavaScript. Посмотрите пример на this question, который поясняет, что единственный способ удалить объекты в JavaScript - с помощью сборщика мусора. Если вы назовете remove или removeAt и т. Д. На свой connectedSquares и не держите никаких других ссылок, это выполнит то, что вы ищете.

Что касается деструкторов, применяются те же ограничения. Если объект, содержащий ссылки на «тело прямоугольника и порты, расположенные на двух концах», становится недоступным, все, что он ссылается, также становится пригодным для сбора мусора - опять же, при отсутствии других ссылок.

В общем, если вы хотите полностью понять семантику времени выполнения Dart, то (на данный момент) необходимо также понимать JavaScript, просматривать скомпилированный код и учиться по аналогии.

+0

Существует много сборников мусора (включая Java и C#), поэтому Дарт, вероятно, собирал мусор, даже если JavaScript не был (ну, по крайней мере, если он все равно может быть скомпилирован для эффективного JavaScript). Собирать мусор не то, что Дарт сожалеет, а не то, что изменится (это не просто «пока»). – lrn

+0

Я считаю, что вы, возможно, неправильно восприняли мои комментарии: я не спорил с сборщиками мусора (и в их пользу в этом отношении). Моя точка зрения заключалась в том, что, хотя Дарт развертывается как скомпилированный JS, у него нет выбора. Когда обычные среды выполнения Dart обычно используются, Google будет в значительной степени свободно развивать язык в любом удобном для них направлении - включая изменения в модели управления памятью. – Tilo

1

Дополнительная информация об удалении.

Ограничения JavaScript влияют на дартс.

  • Нет счетчик ссылок доступен
    Это Javascript особенность и частично из-за коллекции путь мусора работает в браузере: What is JavaScript garbage collection?
  • Нет слабая ссылка доступна (На данный момент)
    Другое ограничение Java-скрипта и из-за отсутствия доступа к счетчику ссылок, само удаление также не является вариантом.
    Примечание: есть Expando, и хотя это полезно, это не является слабым эталонным эквивалентом. Слабая ссылка позволяет создавать ссылки на призрак, которые не поддерживают объект: https://en.wikipedia.org/wiki/Weak_reference.
  • Отсутствует деструктор
    У него нет javascript, поэтому ни толкает.

Как указывали другие, ограничения, указанные выше, как правило, ничто.
Поскольку основной eventloop может сохранять объекты живыми, небрежное кодирование может порождать объект зомби; без деструктора или слабого реферата, некоторые ссылки могут случайно избежать ваших убийственных рук и сохранить объект в живых.

import 'dart:html'; 
import 'dart:async'; 
import 'dart:developer'; 

void main() { 
    var e = new XXX(); 
    var ce = new CustomEvent('custom-event'); 
    var s = new Stream.periodic(new Duration(microseconds: 10000),(count) { 
    print(count); 
    window.dispatchEvent(ce); 
    return count; 
    }); 
    StreamSubscription ss = s.listen((count){print('stream runnig; ${count}_th run');}); 
// e.destroy(); 
// ss.cancel(); 
    e = null; 
    s = null; 
} 
class XXX{ 
    StreamSubscription subscription; 
    XXX(){ 
    subscription = window.on['custom-event'].listen(event_handler); 
    } 
    void say_hi(){ 
    print('hi'); 
    print(this); 
    } 
    void event_handler(_){this.say_hi();} 
    destroy(){ 
    subscription.cancel(); 
    } 
} 

Приведенный выше код печатает ниже навсегда цикла (если вы не раскомментируйте две строки):

.... 
hi 
VM33:1 Instance of 'XXX' 
VM34:1 stream runnig; 751_th run 
VM34:1 752 
VM33:1 hi 
VM33:1 Instance of 'XXX' 
VM34:1 stream runnig; 752_th run 
...... 

Я не знаю, если объект е будет сохраняться без печати (это), может быть, только связанные объекты хранятся от сбора мусора.

В любом случае, с более сложным кодом, необходима ручная очистка, и я хочу, чтобы одна из трех отсутствующих функций была там, но нет.

Удаление действительно может быть затруднено.

+0

См. Также https://github.com/dart-lang/sdk/issues/5144 и https://github.com/dart-lang/sdk/commit/75d1366dbd76566b562248a9d1ba3fbf5f339b41 для постоянной работы над слабыми ссылками. Я не совсем понимаю, какую проблему вы хотите указать. Какое поведение вы ожидаете? До тех пор, пока объект ссылается на «активные» объекты (транзитно связанные с основным или циклом событий), он не получает сбор мусора. –

+0

@ Günter Zöchbauer Спасибо, я вижу, что ошибался в отношении слабых ссылок. Я исправлю пост. Что касается того, что неожиданно для меня, я сначала наклонился на C++, а затем на python, и там события не всегда сохраняют объекты живыми: http: //stackoverflow.com/questions/17211797/does-pyqt4-signal-connect-keep-objects-live , Я вижу преимущество javascript-способа и в ретроспективе да, это очевидно, но я действительно падал. – TastyCatFood

+0

У меня нет глубокой проницательности в этой теме[email protected] может лучше объяснить, что именно происходит. –

Смежные вопросы