我有一个对象数组,当另一个对象撞到其中之一时,该对象将被移除。我已经使用removeChild()从舞台中删除它,并使用splice()从数组中删除它,但是某种方式该对象仍在调用一些函数,这导致错误。如何完全摆脱一个对象?它也没有任何事件监听器。
我有一个对象数组,当另一个对象撞到其中之一时,该对象将被移除。我已经使用removeChild()从舞台中删除它,并使用splice()从数组中删除它,但是某种方式该对象仍在调用一些函数,这导致错误。如何完全摆脱一个对象?它也没有任何事件监听器。
您需要确保删除的显示对象:
stage.addEventListener(...)
调用stage.removeEventListener(...)
Event.ENTER_FRAME
事件setInterval
设置的计时器调用因此,当您使用removeChild
从数组中移除该对象后,请同时调用其stop
方法以确保该对象不再播放其时间线。 还可以在该对象上拥有一个名为halt
,cleanup
或finalize
的方法,以注销任何侦听器、停止计时器、超时、间隔等,并清除对它的父级、舞台或任何不消失的对象的引用(即将变量设置为null
)。
为了完全消除AS3中的一个对象,必须将其值设置为null。垃圾回收将没有问题地删除它,因为没有对它的引用。此外,对于事件监听器,使用“弱引用”可能会有所帮助。创建事件监听器时,通常是事件类型和要触发的函数。
addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);
下面我将用弱引用来说明同样的问题。
addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend, false, 0, true);
我们知道前两个参数是什么,所以让我们从第三个参数开始。第三个参数决定事件在捕获阶段(true)还是冒泡阶段(false,也是默认值)触发onEventHappened函数。我提到这个参数的唯一原因是在设置弱引用参数之前需要它。第四个参数是优先级,当在同一对象和事件流的相同阶段同时监听时,它决定哪些事件具有优先级。第五个参数将弱引用设置为true或false,在这种情况下,我们将使用true,这对于垃圾回收很有帮助。
看起来你可能遇到了Flash播放器的垃圾回收问题。
Flash Player 10新增了一个API以解决此问题:
unloadAndStop()
Grant Skinner在他的博客上有更多相关信息: http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html
你可以在以下网址获取Flash Player 10的Beta版:
http://labs.adobe.com/technologies/flashplayer10/
迈克·钱伯斯
mesh@adobe.com
你所涉及的对象是否为MovieClip,并且是否正在播放时间轴? 如果是,您需要在删除之前停止它。 还要记住,在任何方式下存储对象的引用(尤其是在事件侦听器中)都会防止其被垃圾回收。这包括对函数或子对象的任何引用。
根据定义,要调用函数,必须存在侦听器或 setTimeOut,或者时间轴必须正在播放。确保删除所有侦听器和对象的所有引用。这是什么类型的对象?
输出窗口或调试器应该向您显示导致不需要的调用的函数调用堆栈。如果您将错误输出粘贴到问题中,我们将能够给出更准确的答案。