Сборка мусора во Flex при вызове removeChild () - управление условиями гонки - PullRequest
1 голос
/ 19 октября 2008

У меня есть «фреймворк» во Flex, который загружает и уничтожает дочерние «разделы», которые являются экземплярами классов модулей. В них много веб-сервисов и анимации, и они являются частью общедоступного сайта.

Перед удалением раздела с экрана я вызываю интерфейсный метод hideSection () для экземпляра. В этом методе я убираю любые элементы управления или возвращаю false, если секция хочет предотвратить закрытие себя. В настоящее время он также останавливает запуск любых экземпляров Timer.

Проблема в том, что даже при удалении объекта секции со сцены могут произойти нерешенные события. Например, у меня может быть запущен эффект, когда effectEnded что-то вызывает, или, возможно, медленный запрос веб-службы может прерваться по тайм-ауту и ​​вызвать всплывающую ошибку.

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

Я придумал следующее возможное решение. Интересно, был ли лучший.

  • Имейте свойство _disposed, которое установлено в true. Внутри любого обработчика событий, который может иметь нежелательное поведение (после закрытия раздела), я бы просто сказал: if (_disposed) { return; }.
  • Может также потребоваться реализация интерфейса «IDisposable», как в .NET.

Это действительно мой единственный вариант - или я могу как-то ускорить сборку мусора. Может ли сборка мусора произойти, если все еще были запущены эффекты?

Мне также любопытно, стоит ли мне устанавливать _null, особенно таймеры. Или достаточно просто остановить () таймер, чтобы он стал сборщиком мусора, если на него не осталось ссылок.

Ответы [ 2 ]

1 голос
/ 24 октября 2008

http://gskinner.com/talks/resource-management/

это грандиозный разговор Скиннера о сборке мусора. На слайде 32 он рассказывает о своей системе уборщиков. Вы можете прочитать тогда и затем взять его исходные файлы.

также убедитесь, что вы знакомы с его рассказом о сборке мусора во Flash 9: http://www.gskinner.com/blog/archives/2008/04/failure_to_unlo.html

специально посмотрите на эту часть:

Обходные пути и стратегии Существует четыре основных способа решения этих проблем:

  1. Убедитесь, что вы всегда удаляете прослушиватели событий timer и enterframe из содержимого, которое вы, возможно, захотите загрузить в более крупное приложение. Кроме того, старайтесь избегать сценических слушателей, где это возможно, и немедленно удаляйте их, когда закончите с ними.

  2. Предоставьте в своих SWF-файлах стандартный API-интерфейс, позволяющий другим SWF-файлам сообщать ему о необходимости очистки и прекращения выполнения. Таким образом, приложение загрузки может вызвать этот метод (в блоке try / catch), прежде чем оно выгружает какой-либо контент. Я бы предложил метод .halt (), поддерживаемый слушателем для события «привал» через sharedEvents.

  3. Вы можете загружать SWF-файлы с субдомена. Это неявно поместит его в изолированную программную среду безопасности.

  4. Загрузка содержимого в div-слой поверх основного приложения. Это не лучший вариант, но он решает почти все проблемы.

0 голосов
/ 19 октября 2008

Вы можете удалить все активные прослушиватели событий в методе hideSection ().

removeEventListener(this, listenerFunction, eventType);

Если вы добавили прослушиватель событий со слабой ссылкой , и у вас нет других ссылок на него, цель прослушивателя должна быть собрана сборщиком мусора, тогда.

...