【问题标题】:Itemrender of DataGroup won't release memory - flex(Adobe air)DataGroup 的 Itemrender 不会释放内存 - flex(Adobe air)
【发布时间】:2015-05-08 14:39:26
【问题描述】:

我在 Adob​​e Air 应用程序中有一个数据组组件,我在其中使用了自定义 itemrenderer,我附上了 itemRenderer 的源代码以及我附上了它的分析,

问题: 当我从其他模块返回到当时具有此数据组的模块时,它会再次为 itemrender 创建对象,并且不会释放 itemrender 的先前对象。

如果你有想法,请给我建议

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                xmlns:mx="library://ns.adobe.com/flex/mx"
                autoDrawBackground="false"
                buttonMode="true"
                click="clickHandler(event)"
                mouseChildren="false"
                rollOut="rollOutHandler(event)"
                rollOver="rollOverHandler(event)"
                removedFromStage="itemrenderer1_removedFromStageHandler(event)"
                creationComplete="itemrenderer1_creationCompleteHandler(event)">
    <fx:Script>
        <![CDATA[
            import coX.XXXXXXXXXXXXXXX.event.ThumbEvent;

            import mx.events.FlexEvent;

            protected function image_completeHandler(event:Event):void
            {
                ConsoleUtils.logIt(" ThumbImage.mxml :image_completeHandler - ");
                image.removeEventListener(Event.COMPLETE, image_completeHandler);
                fadeIn.target=image;
                fadeIn.play();
            }

            protected function clickHandler(event:MouseEvent):void
            {
                owner.dispatchEvent(new ThumbEvent("itemclick", data, itemIndex));
            }

            protected function rollOverHandler(event:MouseEvent):void
            {
                owner.dispatchEvent(new ThumbEvent("itemrollover", data, itemIndex));
            }

            protected function rollOutHandler(event:MouseEvent):void
            {
                owner.dispatchEvent(new ThumbEvent("itemrollout", data, itemIndex));
            }

            protected function itemrenderer1_removedFromStageHandler(event:Event):void
            {
                this.removeEventListener(Event.REMOVED_FROM_STAGE, itemrenderer1_removedFromStageHandler);
                this.removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
                this.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
                this.removeEventListener(MouseEvent.CLICK, clickHandler);

                this.removeAllElements();
            }

            protected function itemrenderer1_creationCompleteHandler(event:FlexEvent):void
            {
                this.removeEventListener(FlexEvent.CREATION_COMPLETE, itemrenderer1_creationCompleteHandler);
                image.source="test.png";
                //image.addEventListener(Event.COMPLETE, image_completeHandler);
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:Fade id="fadeIn"
                alphaFrom="0"
                alphaTo="1"/>
    </fx:Declarations>

    <s:BitmapImage id="image"

                   horizontalAlign="center"
                   smooth="true"
                   smoothingQuality="high"
                   verticalAlign="middle"/>
    </s:ItemRenderer>

Profiling 快照

如您所见,在配置文件中,我有 21 个无法回收的孤儿对象,分析显示我保存在第 12 行,而第 12 行是 creation_complete 事件,我已将其删除。

提前致谢

【问题讨论】:

    标签: actionscript-3 apache-flex memory-leaks air desktop-application


    【解决方案1】:

    我使用DataGroup 作为父组件,并且我在DataGroupitemRenderer 属性中定义了上面的itemRenderer,并且在处置函数中我定义DataGroup.itemRendererDataGroup 中为空。所以它将有资格获得GC。我看到现在内存中没有 itemRenderer 的实例。

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2012-03-22
      • 1970-01-01
      • 2012-09-15
      • 2023-03-15
      相关资源
      最近更新 更多