动作3-彻底搬走孩子

时间:2020-03-05 18:55:03  来源:igfitidea点击:

我有一个对象数组,当另一个对象碰到其中一个对象时,该对象将被删除。我已经使用removeChild()从阶段中将其删除,并使用了splice()从数组中将其删除,但是不知何故该对象仍在调用其某些函数,这会导致错误。我如何彻底摆脱物体?也没有与之关联的事件侦听器。

解决方案

回答

听起来我们可能会遇到Flash Player的垃圾回收问题。

已将新的API添加到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/

迈克·钱伯斯

[email protected]

回答

所讨论的对象是MovieClip,并且有时间线播放吗?
如果是这样,则需要先将其停止再卸下。
还请记住,以任何方式存储对对象的引用(尽管最常见的是在事件侦听器中)将防止其被垃圾收集。这包括对函数或者子对象的任何引用。

回答

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

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

回答

还请记住,在处置已移除的对象时,请停止并移除所有相关的计时器:BIT-101:运行中的计时器不会被垃圾收集。曾经。

回答

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

  • 在舞台上没有注册任何收听者,例如我们需要为任何对应的stage.addEventListener(...)调用stage.removeEventListener(...)。
  • 没有用于Event.ENTER_FRAME事件的侦听器
  • 不监听任何计时器上的事件
  • 在任何地方都没有通过setInterval设置的计时器调用
  • 等等,基本上与计时器,舞台,它的父级,加载器和时间线有关的任何事情都可能导致对象徘徊而不被删除

因此,当我们使用removeChild删除对象并将其从保存在数组中的对象中删除后,还请调用其stop方法以确保其未播放其时间轴。在该对象上拥有一种称为"暂停","清理"或者"最终化"的方法,这可以是一件好事,该方法可以取消注册任何侦听器,停止计时器,超时,间隔等,清除引用(即设置变量) (null))到它的父对象,舞台或者任何也不会消失的对象。

回答

我将查看Event.ENTER_FRAME和TimerEvent.TIMER侦听器,确保在删除对象之前将它们设置为空。

回答

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

addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);

下面我将说明相同的内容,但参考文献很少。

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

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