【问题标题】:Is removeChild enough to completely remove a movieclip from Flash Player memory?removeChild 是否足以从 Flash Player 内存中完全删除影片剪辑?
【发布时间】:2011-07-26 15:45:35
【问题描述】:

这条线

clip.removeChild(clip.getChildAt(0));

完全删除 0 索引处的子剪辑?我在某处读到你应该将所有对该剪辑的引用设置为null,但我的代码中没有其他引用。 0 处的剪辑是通过常规 addChild() 添加的。

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    为了让垃圾收集器刷你的对象,你应该:

    -not have any other reference to the object throughout your code
    -the object shouldn't be part of any collection (like Array or Vector)
    -the current reference should be set to null
    

    请务必特别注意第二个条件,当对象是您无法直接控制的集合的一部分时,最常见的情况是它附加了一个侦听器以及何时是显示列表的一部分。最重要的是,当对象是您可以控制的集合的一部分时,还有其他情况,不要忘记也将其从那里删除。

    另外,为了强制垃圾收集器刷你的对象(仅用于测试,而不是生产),你可以使用System.gc(),然后使用System.privateMemory检查内存

    【讨论】:

      【解决方案2】:

      如果您要循环删除它们,请这样做:

      while (clip.childNum > 0)
      {
         var child:MovieClip = clip.getChildAt(0);
         clip.removeChild(child);
      
         // remove all listeners
         child.removeEventListener(...);
      
         child = null;
      }
      

      如果“child”是一个自定义类,您可以调用 kill() 方法来清理您的类/实例中的所有内容。

      【讨论】:

        【解决方案3】:

        不确定,如果剪辑上仍有引用,垃圾收集器可能会破坏对象,请尝试移除事件侦听器并将剪辑引用强制为 null。

        【讨论】:

        • 我认为没有参考。剪辑是在循环中动态创建的。
        【解决方案4】:

        如果您没有引用、没有侦听器或剪辑的任何其他句柄,那么它最终将被垃圾收集。由于 GC 的工作方式,它可能不会立即从内存中删除。但是,您的 DisplayObject 将立即从显示列表中删除。

        但是如果你在你的一个课程中做这样的事情:

        private var mc:MovieClip = new MovieClip();
        
        private function addClip() : void {
            mc.addEventListener(Event.ENTER_FRAME, myListener);
            myClass.addChild(mc);
        }
        

        然后您需要像这样正确删除mc

        private function removeClip() : void {
            mc.removeEventListener(Event.ENTER_FRAME, myListener);
            myClass.removeChild(mc);
            mc = null;
        }
        

        【讨论】:

        • 嗨,没有私有变量:它们是在 for 循环中创建的,只有一个临时变量保存对它们的引用(那个在函数体的末尾被销毁 - 我想 - )。
        • 那么就可以使用removeChild()removeChildAt。可能是这样的? while(clip.numChildren > 0) { clip.removeChildAt(0); }
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 2011-07-13
        • 2018-03-29
        相关资源
        最近更新 更多