SkinnablePopUpContainer не уничтожен

#actionscript-3 #apache-flex #mobile #flex4 #flex4.5

#actionscript-3 #apache-flex #Мобильный #flex4 #flex4.5

Вопрос:

Я отслеживаю свое подключение к Интернету. Когда служба недоступна, я получаю событие от моего URLMonitor. Я прослушиваю это событие и вызываю функцию, которая открывает SkinnablePopUpContainer. Это очень простой компонент, к которому у меня нет подключенных слушателей, и он определяется только внутри функции. Когда пользователь нажимает кнопку внутри SkinnablePopUpContainer, я закрываю компонент и пытаюсь уничтожить его, используя все возможные известные мне способы. Когда я проверяю инструмент профилировщика из Flash Builder, 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;
        }
  

и вот мой SkinnablePopUpContainer

 <?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, возможно, у него есть аналогичная функция?

2. Кроме того, имейте в виду, что фреймворк Flex (в прошлом) сам по себе мог вызывать утечки памяти, поскольку некоторые части фреймворка сохраняли ссылки на объекты. Большинство из них уже устранены… В вашем случае я мог бы заподозрить PopupManager класс или встроенное изображение в вашем всплывающем окне, любую привязку данных, использование пакетов ресурсов и т. Д.

Ответ №1:

Во-первых, строка var ob = this; просто создает ссылочную переменную на «this». Установка этой переменной в значение null не приведет к ее удалению. Он просто снова перенаправит созданную вами переменную на null, поэтому эти 2 строки бесполезны.

Поскольку вы содержали свою локальную переменную noserviceWindow в области действия функции onNoServiceAvailable, она должна автоматически помечаться для сборки мусора, когда на нее больше нет ссылок. Если ваш профилировщик распознает его существование, то, вероятно, где-то в вашем коде есть другая ссылка на него.