簡體   English   中英

Flex Spark Textinput防止GC收集組件

[英]Flex Spark Textinput prevents component to be collected by GC

我有一個自定義組件(相當復雜,所以我不能在這里發布任何代碼,盡管沒關系),我可以將其添加到視圖中。 當從視圖中刪除該組件或切換視圖時,我調用了我自己的dispose方法,該方法刪除了剩余的eventListeners並殺死了一些引用,以便該組件最終可以被GC清空並收集。

一切正常,直到我將Spark TextInput添加到組件的MXML部分(花了我幾個小時才能找出阻止組件收集的原因!),所以我確認TextInput會以某種方式自動添加一些eventListeners。

我的問題是這些聽眾是什么,或者還有什么我沒想到的?

任何幫助將不勝感激!

我將總結我們的討論,以使將來的讀者高興。

找到罪魁禍首

您可以查看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錯誤庫 ,如果還沒有人,請提交一個錯誤。 盡管我必須說,由於Flex正在遷移到Apache,所以我不確定此JIRA是否仍然保持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM