【问题标题】:AS3 MouseEvent and weakReferenceAS3 鼠标事件和弱参考
【发布时间】:2013-12-21 05:00:41
【问题描述】:

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

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


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

现在,这是一个简化的概念,很容易清理,但我的代码非常大,简单的 removeEventListener 不是解决方案。至少不是一个简单的问题。
您对解决此问题有何建议?

【问题讨论】:

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


    【解决方案1】:

    我不确定你的代码有多复杂,但如果每个影片剪辑都有 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 的 Signals 库,它是 AS3 事件的有趣替代品。 (https://github.com/robertpenner/as3-signals)

    【讨论】:

    • 是的,但您不能在所有情况下都使用它。无论如何,我的解决方案是覆盖 addEvent 侦听器方法,并在影片剪辑在舞台上时使其保持挂钩。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多