Actionscript 3 AS3 MouseEvent和weakReference

Actionscript 3 AS3 MouseEvent和weakReference,actionscript-3,memory-leaks,garbage-collection,mouseevent,weak-references,Actionscript 3,Memory Leaks,Garbage Collection,Mouseevent,Weak References,好吧,有件奇怪的事: 我有一个班,这是一个有两个孩子的电影唇,也有电影唇。 我将孩子们添加到他身上,并将基础MovieClip添加到舞台上。其中一个孩子是动画制作的。 一切都很完美 现在,当我在孩子们身上添加MouseEvent.MOUSE_时,一切正常。 然而,如果我将useWeakReference设置为true(第5个参数),鼠标事件将不再触发,但项目已在舞台上。基本上,不知何故,它们不在记忆中 当然,如果我添加一个简单的onEnterFrame对基本MovieClip没有任何作用,它会

好吧,有件奇怪的事:

我有一个班,这是一个有两个孩子的电影唇,也有电影唇。
我将孩子们添加到他身上,并将基础MovieClip添加到舞台上。其中一个孩子是动画制作的。
一切都很完美
现在,当我在孩子们身上添加MouseEvent.MOUSE_时,一切正常。
然而,如果我将useWeakReference设置为true(第5个参数),鼠标事件将不再触发,但项目已在舞台上。基本上,不知何故,它们不在记忆中


当然,如果我添加一个简单的onEnterFrame对基本MovieClip没有任何作用,它会跟踪MovieClip,但MouseEvents不会触发。这意味着物体仍然在那里,但不知何故,对于flash来说却不在那里

现在,这是一个简化的概念,很容易清理,但我的代码非常大,简单的removeEventListener不是解决方案。至少不简单。

您对此有何建议?

我不确定您的代码有多复杂,但如果每个movieclip都有鼠标事件处理程序-某些功能,您确实可以使用removeEventListener鼠标启动功能。例如:

var mc:MovieClip = new MovieClip();
mc.addEventListener( MouseEvent.MOUSE_UP, onMU );
function onMU(e:MouseEvent){
   var target = MovieClip(e.currentTarget);
   target.removeEventListener( MouseEvent.MOUSE_UP, onMU );
}
通过这种方式,您可以拥有多个movieclips并在不知道对象名称的情况下删除侦听器

或者,您可以修改代码以添加所有已添加事件的一部分,然后侦听REMOVE_FROM_STAGE事件。大概是这样的:

var mc:MovieClip = new MovieClip();
mc.events = [];
mc.events.push( { evt: MouseEvent.MOUSE_UP, fn: onMU } );
mc.addEventListener( MouseEvent.MOUSE_UP, onMU } )
//or use events array reference to keep events and functions in one place. 
//when object is removed you can iterate through events array and automatically remove 
//all listeners
另一种选择是创建扩展MovieClip的类——但由于您的代码非常庞大,您可能不想这样做


您还可以查看Robert Penner的信号库,它是AS3事件的有趣替代品。()

是的,但不能在所有情况下都使用此选项。无论如何,我的解决方案是重写addEvent listener方法,只要电影剪辑还在舞台上,就保持它的连接。