代码之家  ›  专栏  ›  技术社区  ›  Skawful

AS3内存泄漏示例

  •  9
  • Skawful  · 技术社区  · 16 年前

    有人可以发布一个as3代码的例子(特别是事件监听器包括在内),这将是一个可能泄漏内存的简单例子。。。也希望你能张贴一个解决方案的问题显示?

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

    3 回复  |  直到 16 年前
        1
  •  7
  •   Juan Pablo Califano    16 年前
    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.
        }
    
    }
    

    其他地方:

    var mySprite:MySprite = new MySprite();
    someHolder.addChild(mySprite);
    

        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()中的代码将继续执行。

        2
  •  4
  •   Bosworth99    15 年前

    我将继续@Juan的回答-GC需要作为应用程序设计的一个关键方面从根本上考虑。如果您创建了一个对象,您必须知道对它的每个引用,并删除每个引用并将其置空以标记properly@. 如果你在数组中引用那个对象,它就计数,如果你在监听器中引用它,它就计数,如果你通过一个局部变量引用它,它也计数(虽然只在函数的生命周期内),如果它只是在显示列表中,它就一定计数,并且一直计数。

    只是为了确保

    我几乎总是为任何对象编写一个public destroy()方法来处理内部对象层次结构(父对象对子对象调用destroy,子对象对任何子对象调用destroy等等)。仅仅删除/取消父级而不对每个子级执行操作是糟糕的GC管理。

    var mem:String = Number( System.totalMemory / 1024 / 1024 ).toFixed( 2 ) + ‘Mb’;
    trace( mem ); // eg traces “24.94Mb”
    

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

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

        3
  •  0
  •   Reshape Media    15 年前

    我不打算贴这个例子,但我会解释一下。你在这里描述了两种情况。

    1. 内存泄漏
    2. 处理器溢出

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

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