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

Actionscript 3-完全删除子级

  •  3
  • Brandon  · 技术社区  · 17 年前

    我有一个对象数组,当另一个对象击中其中一个对象时,该对象将被删除。我已经使用removeChild()将它从stage中移除,并使用splice()将它从数组中移除,但不知何故,该对象仍在调用它的一些函数,这会导致错误。我怎样才能完全摆脱一个物体?也没有与之相关的事件侦听器。

    7 回复  |  直到 17 年前
        1
  •  4
  •   Theo    17 年前

    • 台上没有注册听众,例如,你需要打电话 stage.removeEventListener(...) 对于任何相应的 stage.addEventListener(...)
    • 没有听众 Event.ENTER_FRAME 事件
    • 不监听任何计时器上的事件
    • setInterval 在任何地方
    • 基本上,任何与计时器、舞台、其父级、加载器和时间线有关的东西都会导致对象延迟而无法移除

    所以当你用 removeChild 把它从数组中移除,也叫它的 stop 方法以确保它没有播放其时间轴。在该对象上有一个名为 halt cleanup finalize 取消注册任何侦听器、停止计时器、超时、间隔等,清除引用(即将变量设置为 null

        2
  •  1
  •   mikechambers    17 年前

    听起来你可能遇到了flash播放器的垃圾回收问题。

    Flash Player 10中添加了一个新的API,可以解决以下问题:

    格兰特·斯金纳在他的博客上有更多信息: http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html

    http://labs.adobe.com/technologies/flashplayer10/

    迈克·钱伯斯

    mesh@adobe.com

        3
  •  1
  •   Will Brian Hodge    10 年前

    addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);
    

    下面我将说明相同的,但有一个弱的参考。

    addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend, false, 0, true);
    

    我们知道前两个参数是什么,所以让我们从第三个开始。第三个参数指示事件是在捕获阶段(true)还是冒泡阶段(false也是默认值)触发onEventHappened函数。我提到这个参数的唯一原因是在设置弱引用参数之前需要它。第四个参数是priority,它指示在侦听同一对象和事件流的同一阶段时哪些事件具有优先级。第五个参数将弱引用设置为true或false,对于这种情况,我们将使用true,这有助于垃圾收集。

        4
  •  0
  •   grapefrukt    17 年前

    所讨论的对象是一个MovieClip吗?它是否有播放的时间线? 如果是这样,您将需要停止它之前删除。 还要记住,以任何方式存储对对象的引用(尽管在事件侦听器中最常见)都可以防止对象被垃圾收集。这包括对函数或子对象的任何引用。

        5
  •  0
  •   Iain    17 年前

    输出窗口或调试器应该向您显示导致不需要的调用的函数调用堆栈。如果您将错误输出粘贴到您的问题中,那么我们将能够给您一个更准确的答案。

        6
  •  0
  •   hasseg    17 年前

    在处理移除的对象时,请记住停止并移除任何相关计时器: BIT-101: Running timers are not garbage collected. Ever.

        7
  •  0
  •   matt lohkamp    17 年前

    我会看着Event.ENTER\框架以及定时器侦听器,请确保在移除对象之前将其置空。