2012-03-28 10 views
1

私はビューに追加できるカスタムコンポーネントを持っています(かなり複雑なので、ここにコードを投稿することはできませんが、それは問題ではありません)。コンポーネントがビューから削除されたり、ビューが切り替わったりすると、残りのeventListenersを削除し、いくつかの参照を強制終了する独自のdisposeメソッドを呼び出すので、GCによってコンポーネントが最終的にNULLになり、収集される可能性があります。Flex Spark TextinputはGCでコンポーネントを収集できないようにします

コンポーネントのMXML部分にSpark TextInputを追加するまでは完璧に機能します(コンポーネントの収集を妨げているのは何時間かかかりました!)ので、TextInputが自動的にいくつかのeventListener。

私の質問は、これらのリスナーは何ですか、または私が考えなかったことがありますか?

ご協力いただければ幸いです!

+1

'hasEventListener()'メソッドを使って、削除されていないリスナーがあればそれを調べることができます。 SkinnableTextBaseのソースコードを調べて、内部的に追加されるリスナーを確認してください。 – RIAstar

+0

ありがとうございますRIAstar。確かに削除されないリスナーが2つあります(MouseEvent.MOUSE_DOWNおよびTouchInteractionEvent.TOUCH_INTERACTION_START)。私は最初にアドビを追加するときにAdobeが(少なくとも)弱い参照を使用しなかったのだろうと思っています。とにかく、これらのリスナーをコンポーネント内から簡単に削除する方法はありますか?私は自分のコンポーネント内からTextBaseのリスナー機能にアクセスすることはできません。その機能を拡張し、独自のTextInputをオーバーライドするだけで、それらのリスナー機能にアクセスして削除することはできません。 – AlBirdie

+1

'styleChanged()'メソッドを見てください。TextInputの 'interactMode'スタイルを' InteractionMode.MOUSE'に設定すると、リスナーが削除されるようです。 – RIAstar

答えて

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.MOUSEに設定すると、リスナーが削除されることを意味します。


注:JIRA bug baseを見て、誰もがすでに持っている場合は、バグを提出することをお勧めします。 FlexがApacheに移行した今、このJIRAがまだ維持されているかどうかはわかりませんが、

関連する問題