[英]Flex Spark Textinput prevents component to be collected by GC
我有一個自定義組件(相當復雜,所以我不能在這里發布任何代碼,盡管沒關系),我可以將其添加到視圖中。 當從視圖中刪除該組件或切換視圖時,我調用了我自己的dispose方法,該方法刪除了剩余的eventListeners並殺死了一些引用,以便該組件最終可以被GC清空並收集。
一切正常,直到我將Spark TextInput添加到組件的MXML部分(花了我幾個小時才能找出阻止組件收集的原因!),所以我確認TextInput會以某種方式自動添加一些eventListeners。
我的問題是這些聽眾是什么,或者還有什么我沒想到的?
任何幫助將不勝感激!
我將總結我們的討論,以使將來的讀者高興。
找到罪魁禍首
您可以查看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錯誤庫 ,如果還沒有人,請提交一個錯誤。 盡管我必須說,由於Flex正在遷移到Apache,所以我不確定此JIRA是否仍然保持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.