2014-06-23 5 views
0

인터넷 연결을 모니터링하고 있습니다. 사용할 수있는 서비스가 없으면 URLMonitor에서 이벤트를받습니다. 이 이벤트를 듣고 SkinnablePopUpContainer를 여는 함수를 호출합니다. 그것은 매우 간단한 컴포넌트입니다. 리스너가 붙어 있지 않으며 함수 내에 만 정의되어 있습니다. 사용자가 SkinnablePopUpContainer 내부의 버튼을 클릭하면 구성 요소를 닫고 내가 아는 모든 가능한 방법을 사용하여 구성 요소를 파괴하려고합니다. Flash Builder에서 프로파일 러 도구를 검사하면 SkinnablePopUpContainer가 여전히 존재합니다. 이 구성 요소를 파괴하여 어떻게 사용중인 메모리를 확보 할 수 있습니까? 여기 SkinnablePopUpContainer가 파손되지 않았습니다.

는 리스너 함수입니다 : 내 SkinnablePopUpContainer

 protected function onNoServiceAvailable(e:*):void 
     { 
      var noserviceWindow:NoInternetError = new NoInternetError(); 
      noserviceWindow.open(this,false);  
      noserviceWindow.x= 0; 
      noserviceWindow.y= 0; 
      noserviceWindow.width = SharedObject.getLocal('localObj').data.appMeasures.appWidth; 
      noserviceWindow.height = SharedObject.getLocal('localObj').data.appMeasures.appHeight+200; 
     } 

하고 여기

<?xml version="1.0" encoding="utf-8"?> 
<s:SkinnablePopUpContainer xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:nxTextInput="nx.components.extended.nxTextInput.*" 
     xmlns:nxButton="nx.components.extended.nxButton.*" 
     backgroundAlpha="0.4" 
     horizontalCenter="0" verticalCenter="0" width="100%" height="100%"> 
    <fx:Script> 
    <![CDATA[ 

     protected function loginButton_clickHandler(event:Event):void 
     { 
      loginButton.removeEventListener(MouseEvent.CLICK,loginButton_clickHandler); 
      this.close(); 
      var ob = this; 
      ob = null; 
     } 

    ]]> 
</fx:Script> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<s:Panel title="Fehler" 
     horizontalCenter="0" verticalCenter="0" color="white"> 
    <s:VGroup horizontalAlign="center" verticalAlign="middle" gap="20" 
       height="100%" width="100%"> 
     <s:BitmapImage source="@Embed('assets/nxInspect/mobile/assetsCI/redAssets/alert_80x80.png')" id="iconBitmpapDownOnline" verticalCenter="0" /> 
     <s:Label id="serviceFailure" text="Keine internetverbindung." width="90%" styleName="interactable" textAlign="center" color="white"/> 
     <nxButton:NxButton id="loginButton" label="OK" width="100%" height="100" click="loginButton_clickHandler(event)" styleName="alert"/> 
    </s:VGroup> 

</s:Panel> 

+1

프로파일 러 (Flash Builder에서)는 "느슨한 객체"를 표시하고 해당 객체 목록에서 각 객체의 "gc_root"가 무엇인지 확인할 수있었습니다. "gc_root"("가비지 수집 루트"또는 이와 유사한 이름)는 객체를 메모리에 고정 된 상태로 유지하는 것입니다. 지금은 사람들이 어도비 스카우트 (Adobe Scout)를 사용하고 있다고 생각합니다. 아마 비슷한 기능을 가지고있을 것입니다. –

+0

또한 Flex 프레임 워크 (이전에는 자체)가 메모리 누수를 일으킬 수 있다는 점을주의해야합니다. b/c 프레임 워크의 일부는 객체에 대한 참조를 유지했습니다. 그 중 대부분은 지금까지 해결되었습니다 ... 귀하의 경우에는'PopupManager' 클래스 또는 팝업의 포함 된 이미지, 데이터 바인딩, 리소스 번들 사용 등을 의심 할 수 있습니다. –

답변

1

우선, 라인 VAR 산부인과 =이; "this"에 대한 참조 변수를 만듭니다. 이 변수를 null로 설정해도이 변수 자체는 삭제되지 않습니다. 방금 작성한 변수를 다시 참조하기 때문에 두 줄은 쓸모가 없습니다.

지역 변수 noserviceWindow가 onNoServiceAvailable 함수의 범위 내에 포함되어 있으므로 더 이상 참조가 없을 때 가비지 수집을 위해 자동으로 표시되어야합니다. 프로파일 러가 코드의 존재를 인식하고 있다면 코드의 어딘가에 다른 참조가있을 것입니다.