【问题标题】:Flex Spark Textinput prevents component to be collected by GCFlex Spark Textinput 防止组件被 GC 收集
【发布时间】:2012-04-11 22:22:38
【问题描述】:

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

在我将 Spark TextInput 添加到组件的 MXML 部分之前,所有这些都可以正常工作(我花了几个小时才找出阻止组件被收集的原因!),所以我发现 TextInput 以某种方式自动添加了一些事件监听器。

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

任何帮助将不胜感激!

【问题讨论】:

  • 您可以尝试使用hasEventListener() 方法来确定哪些侦听器没有被删除(如果有)。查看 SkinnableTextBase 的源代码,看看内部添加了哪些监听器。
  • 非常感谢RIAstar。确实有两个未删除的侦听器(MouseEvent.MOUSE_DOWN 和 TouchInteractionEvent.TOUCH_INTERACTION_START)。我想知道为什么 Adob​​e 在添加它们时没有(至少)使用弱引用。无论如何,有没有一种快速的方法可以从我的组件中删除这些侦听器?我无法从我的组件中访问 TextBase 的侦听器函数,我想避免扩展它并制作我自己的 TextInput 只是为了覆盖然后能够访问这些侦听器函数以删除它们。
  • 查看styleChanged() 方法:看起来如果您将TextInput 的interactionMode 样式设置为InteractionMode.MOUSE,则会删除侦听器。
  • 啊废话,完全没看到。按预期工作。 ;) 非常感谢!您可能想在此处添加您的 cmets 作为正式答案,以便我将其标记为已回答。

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


【解决方案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 并提交一个错误,如果没有人已经有。虽然我必须说我不确定现在 Flex 正在迁移到 Apache,这个 JIRA 是否仍然存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多