我有一个自定义组件(非常复杂,所以我不能在这里发布任何代码,尽管这不重要),我可以添加到视图中。当从视图中删除组件或切换视图时,我调用我自己的dispose方法,该方法删除剩余的eventListeners并杀死一些引用,以便GC最终可以对组件进行整理和收集。
所有这一切都完美无缺,直到我将Spark TextInput添加到组件的MXML部分(我花了几个小时来找出阻止组件收集的内容!),所以我认为TextInput会以某种方式自动添加一些事件监听器。
我的问题是这些听众是什么,或者还有什么我没有想到的?
非常感谢任何帮助!
答案 0 :(得分:1)
我将为未来读者的快乐总结我们的讨论。
找到罪魁祸首
您可以查看SkinnableTextBase的代码,了解内部附加了哪些事件侦听器。既然您知道这一点,就可以使用hasEventListener()来测试哪些未被删除。使用这种技术,我们发现这些听众仍然挥之不去:
删除它们(最好没有子类化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。