2008-10-19 4 views
1

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

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

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

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

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

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

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

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

ответ

0

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

removeEventListener(this, listenerFunction, eventType); 

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

1

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

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

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

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

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

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

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

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

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