Flex Spark Textinput可防止GC收集组件

时间:2012-03-28 10:26:59

标签: actionscript-3 flex mobile flex4 flex-spark

我有一个自定义组件(非常复杂,所以我不能在这里发布任何代码,尽管这不重要),我可以添加到视图中。当从视图中删除组件或切换视图时,我调用我自己的dispose方法,该方法删除剩余的eventListeners并杀死一些引用,以便GC最终可以对组件进行整理和收集。

所有这一切都完美无缺,直到我将Spark TextInput添加到组件的MXML部分(我花了几个小时来找出阻止组件收集的内容!),所以我认为TextInput会以某种方式自动添加一些事件监听器。

我的问题是这些听众是什么,或者还有什么我没有想到的?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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;
        }
    }
}

这意味着如果您将TextInput的interactionMode样式设置为InteractionMode.MOUSE,那么应删除侦听器。


注意:您可能需要查看JIRA bug base并提交错误(如果还没有)。虽然我必须说我现在还不确定这个JIRA是否仍在维护,因为Flex正在转向Apache。