Actionscript 3 - 完全移除子元素

3

我有一个对象数组,当另一个对象撞到其中之一时,该对象将被移除。我已经使用removeChild()从舞台中删除它,并使用splice()从数组中删除它,但是某种方式该对象仍在调用一些函数,这导致错误。如何完全摆脱一个对象?它也没有任何事件监听器。


当你说“另一个对象撞到其中一个”时,你是什么意思? - mmattax
我使用 hitTestObject 进行碰撞检测,如果返回 true,则希望将数组中的对象从内存中完全删除。 - Brandon
7个回答

4

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

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

因此,当您使用removeChild从数组中移除该对象后,请同时调用其stop方法以确保该对象不再播放其时间线。 还可以在该对象上拥有一个名为haltcleanupfinalize的方法,以注销任何侦听器、停止计时器、超时、间隔等,并清除对它的父级、舞台或任何不消失的对象的引用(即将变量设置为null)。


非常好的建议,非常感谢。我特别喜欢最后一段关于添加一个单独的函数来处理这个问题的想法。聪明。 - Richard

1

为了完全消除AS3中的一个对象,必须将其值设置为null。垃圾回收将没有问题地删除它,因为没有对它的引用。此外,对于事件监听器,使用“弱引用”可能会有所帮助。创建事件监听器时,通常是事件类型和要触发的函数。

addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);

下面我将用弱引用来说明同样的问题。

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

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


1

0

你所涉及的对象是否为MovieClip,并且是否正在播放时间轴? 如果是,您需要在删除之前停止它。 还要记住,在任何方式下存储对象的引用(尤其是在事件侦听器中)都会防止其被垃圾回收。这包括对函数或子对象的任何引用。


0

根据定义,要调用函数,必须存在侦听器或 setTimeOut,或者时间轴必须正在播放。确保删除所有侦听器和对象的所有引用。这是什么类型的对象?

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


0

0
我会查看Event.ENTER_FRAME和TimerEvent.TIMER监听器,确保在移除对象之前将它们设置为null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接