Flex Spark Textinput предотвращает сбор компонента GC - PullRequest
1 голос
/ 28 марта 2012

У меня есть пользовательский компонент (довольно сложный, поэтому я не могу публиковать здесь код, хотя это не должно иметь значения), который я могу добавить к представлению. Когда компонент удаляется из представления или представление переключается, я вызываю свой собственный метод dispose, который удаляет оставшиеся eventListeners и убивает некоторые ссылки, так что компонент в конечном итоге может быть обнулен и собран GC.

Все это прекрасно работает, пока я не добавлю Spark TextInput в часть компонента MXML (мне потребовались часы, чтобы выяснить, что мешает сбору компонента!), Поэтому я констатирую, что TextInput как-то автоматически добавляет некоторые eventListeners.

У меня вопрос, что это за слушатели, или есть что-то еще, о чем я не подумал?

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 28 марта 2012

Подведу итоги нашего обсуждения для удовольствия будущих читателей.

Найди виновника

Вы можете взглянуть на код SkinnableTextBase , чтобы увидеть, какие прослушиватели событий подключены внутри. Теперь, когда вы это знаете, вы можете использовать hasEventListener () , чтобы проверить, какие из них не были удалены. Используя эту технику, мы обнаружили, что эти слушатели все еще задерживаются:

  • MouseEvent.MOUSE_DOWN
  • TouchInteractionEvent.TOUCH_INTERACTION_START

Удаление их (желательно без подкласса TextInput)

Посмотрите код SkinnableTextBase, где зарегистрированы эти слушатели:

override public function styleChanged(styleProp:String):void
{
    super.styleChanged(styleProp);

    if (!styleProp ||
        styleProp == "styleName" || styleProp == "interactionMode")
    {
        if (getStyle("interactionMode") == InteractionMode.TOUCH && !touchHandlersAdded)
        {
            addEventListener(MouseEvent.MOUSE_DOWN, touchMouseDownHandler);
            addEventListener(TouchInteractionEvent.TOUCH_INTERACTION_START,
                touchInteractionStartHandler);
            touchHandlersAdded = true;
        }
        else if (getStyle("interactionMode") == InteractionMode.MOUSE && touchHandlersAdded)
        {
            removeEventListener(MouseEvent.MOUSE_DOWN, touchMouseDownHandler);
            removeEventListener(TouchInteractionEvent.TOUCH_INTERACTION_START,
                touchInteractionStartHandler);
            touchHandlersAdded = false;
        }
    }
}

Это означает, что если вы установите стиль interactionMode TextInput InteractionMode.MOUSE, это должно удалить слушателей.


Примечание. Возможно, вы захотите взглянуть на базу ошибок JIRA и сообщить об ошибке, если ее еще никто не обнаружил. Хотя я должен сказать, что не уверен, что этот JIRA сохраняется и сейчас, когда Flex переходит на Apache.

...