首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AS3内存泄漏示例

AS3内存泄漏示例
EN

Stack Overflow用户
提问于 2010-04-10 00:23:25
回答 3查看 4.8K关注 0票数 9

是否有人可以发布一个as3代码示例(特别是事件侦听器),这将是一个可能泄漏内存的简单示例……同样希望你能发布一个问题的解决方案?

问题是: AS3事件侦听器中内存泄漏的简单示例是什么?您如何解决它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-10 22:43:43

代码语言:javascript
运行
复制
public class MySprite extends Sprite {

    public function MySprite() {
        if(stage) {
            init();
        } else {
            addEventListener(Event.ADDED_TO_STAGE,init);
        }
    } 

    private function init(e:Event = null):void {
        stage.addEventListener(Event.RESIZE,handleStageResize);
    }

    private function handleStageResize(e:Event):void {
        //  do some processing here.
    }

}

其他地方:

代码语言:javascript
运行
复制
var mySprite:MySprite = new MySprite();
someHolder.addChild(mySprite);

现在,如果稍后删除了mySprite,它仍然会挂在内存中,因为它已经在init()方法中将自身(或对自身的引用)添加到了stage中。

在这种情况下,避免这种情况的最佳方法是在从显示列表中删除mySprite时删除添加到舞台的侦听器。

代码语言:javascript
运行
复制
    private function init(e:Event = null):void {
        addEventListener(Event.REMOVED_FROM_STAGE,cleanUp);
        stage.addEventListener(Event.RESIZE,handleStageResize);

    }

    private function cleanUp(e:Event):void {
       stage.removeEventListener(Event.RESIZE,handleStageResize); 
    }

我相信其他人会告诉你在将监听器添加到舞台时使用弱引用,但无论如何你都应该删除你的监听器。如果不这样做,当您从显示列表中删除mySprite并且没有对它的其他引用时,将有资格进行GC,并且最终将从内存中清除。但在此之前,handleStageResize()中的代码将继续执行。

票数 7
EN

Stack Overflow用户

发布于 2011-05-29 09:39:16

我将跟进@Juan的回答-- GC需要作为应用程序设计的一个关键方面从头开始考虑。如果你创建了一个对象,你必须知道对它的每个引用,并移除每个引用并将其置为空,以便正确地标记为@。如果您在数组中引用该对象,则计数;如果您在侦听器中引用该对象,则计数;如果您通过局部变量引用该对象,则计数也算数(尽管仅在函数生命周期内);如果它只是在显示列表中,则绝对计数,等等。

我甚至在添加它们之前编写了我的删除侦听器语句,以确保它们。

我几乎总是会为任何对象编写一个公共销毁()方法来处理内部对象层次结构(父级调用子级的销毁,子级调用销毁,以此类推)。只是移除/清空一个父级而不对每个子级执行此操作,这是糟糕的GC管理。

如果你真的担心mem泄露的出现,那就追踪System.totalMemory来确认一下:

代码语言:javascript
运行
复制
var mem:String = Number( System.totalMemory / 1024 / 1024 ).toFixed( 2 ) + ‘Mb’;
trace( mem ); // eg traces “24.94Mb”

大多数情况下--只是要有条不紊--这不是火箭科学,但你必须小心。

干杯-

@即使你这样做了,flash也会自己决定何时进行扫描。我们所能做的最好的事情就是确保一个对象被正确地标记,并相信它会得到有效的处理。

票数 4
EN

Stack Overflow用户

发布于 2011-05-29 08:50:39

我不打算发布一个这样的例子,但我会解释一下。您在这里描述了两种情况。

  1. memory leaks
  2. processor overflows

AS3以不同的方式处理内存和处理器操作。

当有许多对象被创建和销毁时,就会发生内存泄漏。当对象有引用时会泄漏内存,并且对象在没有销毁引用的情况下被销毁-因此,留下一个未使用的对象的内存块= leak。

当你有许多方法相互引用而没有“闭合循环”时,就会发生处理器溢出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2609093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档