我有一个对象数组,当另一个对象碰到其中一个时,该对象将被删除。我已经使用 removeChild() 从舞台上删除了它,并使用 splice() 从数组中删除了它,但不知何故,该对象仍在调用它的一些导致错误的函数。我如何完全摆脱一个对象?也没有与之相关的事件侦听器。
7 回答
您需要确保要删除的显示对象:
- 没有在舞台上注册的听众,例如您需要调用
stage.removeEventListener(...)
任何相应的stage.addEventListener(...)
- 没有
Event.ENTER_FRAME
事件的监听器 - 不监听任何计时器上的事件
setInterval
不被任何地方设置的计时器调用- 等等基本上与计时器、舞台、它的父级、加载器和时间线有关的任何事情都可能导致对象逗留而不被删除
因此,当您删除对象removeChild
并将其从保存它的数组中删除时,还要调用它的stop
方法以确保它没有播放它的时间线。在该对象上拥有一个名为类似的方法halt
,cleanup
或者finalize
取消注册任何侦听器、停止计时器、超时、间隔等,清除对null
其父级、舞台或任何不会消失的物体。
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
要完全摆脱 AS3 中的对象,您必须将其值设置为 null。垃圾回收将不会有任何问题,因为没有对它的引用。此外,如果对事件侦听器使用“弱引用”可能会有所帮助。创建事件侦听器时,它通常是事件类型和要触发的函数。
addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);
下面我将说明相同的内容,但参考较弱。
addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend, false, 0, true);
我们知道前两个参数是什么,所以让我们从第三个开始。第三个参数指示事件是在捕获阶段(true)还是冒泡阶段(false,也是默认值)触发 onEventHappened 函数。我提到这个参数的唯一原因是在设置弱引用参数之前需要它。第四个参数是优先级,它指示在侦听同一对象和事件流的同一阶段时哪些事件具有优先级。第五个参数将弱引用设置为 true 或 false,对于这种情况,我们将使用 true,这有助于垃圾收集。
有问题的对象是影片剪辑吗?它是否有时间线播放?如果是这样,您需要在删除之前停止它。还要记住,以任何方式存储对对象的引用(尽管最常见的是在事件侦听器中)将防止它被垃圾收集。这包括对函数或子对象的任何引用。
我会查看 Event.ENTER_FRAME 和 TimerEvent.TIMER 侦听器,确保在删除对象之前将它们无效。
Also remember to stop and remove any related Timers when disposing of the removed objects: BIT-101: Running timers are not garbage collected. Ever.
对于要调用的函数,根据定义,某处必须有侦听器或 setTimeOut,或者时间线必须正在播放。确保删除所有侦听器和对该对象的所有引用。它是一个什么样的对象?
输出窗口或调试器应该向您显示导致不需要的调用的函数调用堆栈。如果您将错误输出粘贴到您的问题中,那么我们将能够为您提供更准确的答案。