2012-03-28 3 views
1

뷰에 추가 할 수있는 사용자 정의 구성 요소가 있습니다 (상당히 복잡하므로 여기에 코드를 게시 할 수는 없지만 중요하지는 않습니다). 구성 요소가 뷰에서 삭제되거나 뷰가 전환 될 때 나 자신의 dispose 메서드를 호출하여 나머지 eventListeners를 제거하고 일부 참조를 제거하므로 구성 요소가 결국 Null 처리되고 GC로 수집 될 수 있습니다.Flex Spark Textinput은 GC로 구성 요소를 수집하지 못하도록합니다.

구성 요소의 MXML 부분에 Spark TextInput을 추가 할 때까지 완벽하게 작동합니다 (구성 요소가 수집되지 않도록하는 데 몇 시간이 걸렸습니다!). 그래서 TextInput이 자동으로 추가됩니다. 일부 eventListener.

제 질문은이 청취자가 무엇인지 또는 내가 생각하지 못한 것이 있습니까?

도움이 될 것입니다.

+1

'hasEventListener()'메서드를 사용하여 어떤 리스너가 제거되지 않았는지 확인할 수 있습니다. SkinnableTextBase의 소스 코드를보고 내부적으로 추가 된 수신기를 확인하십시오. – RIAstar

+0

정말 고마워요 RIAstar. 실제로 제거되지 않은 리스너가 두 개 있습니다 (MouseEvent.MOUSE_DOWN 및 TouchInteractionEvent.TOUCH_INTERACTION_START). 나는 어도비가 왜 처음에 그들을 추가 할 때 약한 참조를 사용하지 않았는지 궁금해. 어쨌든, 내 구성 요소 내에서 해당 수신기를 제거하는 빠른 방법이 있습니까? 내 구성 요소 내에서 TextBase의 청취자 기능에 액세스 할 수 없으며이를 확장하고 내 TextInput을 작성하여 무시한 다음 해당 청취자 기능에 액세스하여 제거 할 수 있기를 바랍니다. – AlBirdie

+1

'styleChanged()'메소드를 보자. TextInput의'interactionMode' 스타일을'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가 여전히 유지되고 있는지 확실하지 않습니다.

관련 문제