将 event.target 设置为空

Set event.target to null

我想使 event.target 无效以进行垃圾回收,因为不再需要 moveclip。我的大概是这样的:

mc.addEventListener(MouseEvent.CLICK, destroy);

 public function destroy(event:MouseEvent):void {


       event.target.parent.removeChild(event.target); 

       event.target.removeEventListener(MouseEvent.CLICK, destroyShape);

       event.target = null; //THIS IS WHAT I WANT TO ACHIEVE


   }

我确定这相对简单,但我不确定该怎么做。

谢谢

您无法更改 MouseEvent.target 值。这是一个只读 属性。如果您的 MovieClip 不存在(removeChild)并且您删除了事件处理程序 mc.removeEventListener(MouseEvent.CLICK, destroy); 然后垃圾收集器会自动将其删除。

正如@subdan 所述,任何事件的目标 属性 都是只读的 属性。 您仍然可以使您的影片剪辑无效,但不像您的示例那样。

mc.addEventListener(MouseEvent.CLICK, destroy);

public function destroy(event:MouseEvent):void 
{

   var myMC:MovieClip = event.target as MovieClip;

   if( myMC )
   {  
       myMC.removeEventListener(MouseEvent.CLICK, destroyShape);
       myMC.parent.removeChild(myMC);
       myMC = null; //THIS IS WHAT I WANT TO ACHIEVE
   }
}

您试图实现的目标(如果可能的话)在垃圾收集方面将一事无成。

除非重新调度,否则事件将在方法完成后立即被垃圾收集运行。事件的所有属性也将被丢弃。事件本身及其属性的这种垃圾收集对它们在垃圾收集方面指向的对象绝对没有影响。

在最初调度事件的范围内,对象将在事件本身被丢弃后继续存在。也就是说,必须在该范围内取消对象引用,而不是在事件侦听器范围内无效,因为该对象仍然存在于调度范围内。

接受的解决方案也没有任何作用。这与在木腿上缠绷带一样重要。 function/method 中的任何局部变量在方法运行后立即符合 GC 的条件。使这些变量无效没有任何效果,也不构成对任何问题的有效答案,当然也不是 GC 问题。这些变量是 GC 也不构成它们指向的对象将是 GC 的保证。

在这种情况下,通过发布虚假且不相关的解决方案来询问和回答有关不存在和被误解的问题。

恰当的例子:只有当前在显示列表中并附加到舞台的 DisplayObject 才能成为 MouseEvent 的目标。在从它所属的显示列表中删除之前,该对象根本不可能变得可用于垃圾收集。由于这些原因,该对象在 MouseEvent 侦听器运行时无法获得 GC 资格,因为该对象仍然具有至少一个强引用,因为它附加到显示列表。这证明 PO 的要求是错误的,任何代码示例也是错误的,因为它们无法在那个时间点为 GC 限定对象。