Flex Spark Textinput предотвращает сбор компонента сборщиком мусора

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

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

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

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


person AlBirdie    schedule 28.03.2012    source источник
comment
Вы можете попробовать использовать метод hasEventListener(), чтобы определить, какие прослушиватели не удаляются, если таковые имеются. Посмотрите исходный код SkinnableTextBase, чтобы увидеть, какие слушатели добавляются внутри.   -  person RIAstar    schedule 28.03.2012
comment
Большое спасибо РИАстар. На самом деле есть два прослушивателя, которые не удалены (MouseEvent.MOUSE_DOWN и TouchInteractionEvent.TOUCH_INTERACTION_START). Мне интересно, почему Adobe не использовала (по крайней мере) слабые ссылки при их добавлении в первую очередь. В любом случае, есть ли быстрый способ удалить этих слушателей из моего компонента? Я не могу получить доступ к функции слушателя TextBase из своего компонента, и я хотел бы избежать ее расширения и создания собственного TextInput только для переопределения, а затем иметь доступ к этой функции прослушивателя, чтобы удалить их.   -  person AlBirdie    schedule 28.03.2012
comment
Посмотрите на метод styleChanged(): может показаться, что если вы установите стиль interactionMode TextInput на InteractionMode.MOUSE, это удалит прослушиватели.   -  person RIAstar    schedule 28.03.2012
comment
Блин, совсем не видел. Работает как положено. ;) Большое Вам спасибо! Возможно, вы захотите добавить свои комментарии в качестве официального ответа здесь, чтобы я мог пометить его как отвеченный.   -  person AlBirdie    schedule 28.03.2012


Ответы (1)


Я подытожу нашу дискуссию для удовольствия будущих читателей.

Найти виновного

Вы можете посмотреть код 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.

person RIAstar    schedule 28.03.2012