AS3 MouseEvent和weakReference

时间:2013-12-04 15:55:14

标签: actionscript-3 memory-leaks garbage-collection mouseevent weak-references

好的,这是一件奇怪的事情:

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


当然,如果我添加一个简单的onEnterFrame,它不会基于MovieClip,它会跟踪MovieClip,但MouseEvents不会触发。这意味着对象仍然存在,但不知何故闪存不是

现在,这是一个简化的概念,易于清理,但我的代码非常大,而简单的removeEventListener不是解决方案。至少不是一个简单的 您有什么建议可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不确定你的代码有多复杂,但如果每个movieclip都有MOUSE_UP事件处理程序 - 某些函数,你确实可以使用removeEventListener MOUSE_UP函数。例如:

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 );
}

通过这种方式,您可以拥有多个动画片段,并在不知道对象名称的情况下删除侦听器。

或者,您可以修改代码以添加所有已添加事件的数组,然后收听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事件的有趣替代品。 (https://github.com/robertpenner/as3-signals