3

我有一个对象数组,当另一个对象碰到其中一个时,该对象将被删除。我已经使用 removeChild() 从舞台上删除了它,并使用 splice() 从数组中删除了它,但不知何故,该对象仍在调用它的一些导致错误的函数。我如何完全摆脱一个对象?也没有与之相关的事件侦听器。

4

7 回答 7

4

您需要确保要删除的显示对象:

  • 没有在舞台上注册的听众,例如您需要调用stage.removeEventListener(...)任何相应的stage.addEventListener(...)
  • 没有Event.ENTER_FRAME事件的监听器
  • 不监听任何计时器上的事件
  • setInterval不被任何地方设置的计时器调用
  • 等等基本上与计时器、舞台、它的父级、加载器和时间线有关的任何事情都可能导致对象逗留而不被删除

因此,当您删除对象removeChild并将其从保存它的数组中删除时,还要调用它的stop方法以确保它没有播放它的时间线。在该对象上拥有一个名为类似的方法haltcleanup或者finalize取消注册任何侦听器、停止计时器、超时、间隔等,清除对null其父级、舞台或任何不会消失的物体。

于 2008-09-16T18:53:02.543 回答
1

It sounds like you may be running into a garbage collection issue with the flash player.

A new API has been added to Flash Player 10 that should address this:

unloadAndStop()

Grant Skinner has more info on this on his blog: http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html

You can grab a beta of Flash Player 10 at:

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

mike chambers

mesh@adobe.com

于 2008-09-16T05:14:44.337 回答
1

要完全摆脱 AS3 中的对象,您必须将其值设置为 null。垃圾回收将不会有任何问题,因为没有对它的引用。此外,如果对事件侦听器使用“弱引用”可能会有所帮助。创建事件侦听器时,它通常是事件类型和要触发的函数。

addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);

下面我将说明相同的内容,但参考较弱。

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

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

于 2008-09-22T19:57:13.750 回答
0

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

于 2008-09-16T07:18:13.820 回答
0

我会查看 Event.ENTER_FRAME 和 TimerEvent.TIMER 侦听器,确保在删除对象之前将它们无效。

于 2008-09-16T22:08:41.170 回答
0

Also remember to stop and remove any related Timers when disposing of the removed objects: BIT-101: Running timers are not garbage collected. Ever.

于 2008-09-16T16:01:02.660 回答
0

对于要调用的函数,根据定义,某处必须有侦听器或 setTimeOut,或者时间线必须正在播放。确保删除所有侦听器和对该对象的所有引用。它是一个什么样的对象?

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

于 2008-09-16T13:04:39.620 回答