我想取消垃圾收集的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
}
我确定这个相对简单,但我不知道该怎么做。
感谢
答案 0 :(得分:1)
您无法更改MouseEvent.target值。它是一个只读属性。如果您的MovieClip不存在(removeChild)并且您删除了事件处理程序
mc.removeEventListener(MouseEvent.CLICK, destroy);
然后垃圾收集器会自动删除它。
答案 1 :(得分:0)
你想要实现的目标(如果可能的话)在垃圾收集方面没有任何成效。
除非重新分配,否则只要方法运行完毕,就会对事件进行垃圾回收。该事件的所有属性也将被丢弃。事件本身及其属性的垃圾收集对于他们在垃圾收集方面指向的对象绝对没有影响。
在首先调度事件的范围内,对象将在事件本身被丢弃后继续存在。那就是在该范围内,对象引用必须是无效的,而不是在事件监听器范围内,因为对象仍然存在于调度范围,所以它将不起作用。
接受的解决方案也没有做任何事情。这与将绷带应用于木腿相关。函数/方法中的任何局部变量在方法运行后立即符合GC的条件。对这些变量进行无效处理没有任何效果,并且不构成对任何问题的有效答案,当然也不是GC问题。那些变量是GC也不构成他们指向的对象将是GC的保证。
这是一个通过发布错误且无关的解决方案来询问和回答关于不存在和被误解的问题的问题。
实例:只有当前位于显示列表中且附加到舞台的DisplayObject才能成为MouseEvent的目标。在将对象从其所属的显示列表中删除之前,该对象根本不可能用于垃圾收集。由于这些原因,当MouseEvent侦听器运行时,该对象无法限定GC,因为该对象仍具有至少一个强引用,因为它附加到显示列表。这证明了PO提出的问题是错误的,任何代码示例都被误导,因为他们无法在那个时间点对GC进行限定。
答案 2 :(得分:-1)
正如@subdan所述,任何Event的target属性都是readonly属性。 您仍然可以将影片剪辑归零但与样本中的内容不同。
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
}
}