【发布时间】:2012-06-04 07:44:27
【问题描述】:
removeEventListener 和 dealloc 一样必要吗?
我知道在 AS3 中可能会出现内存泄漏,我只是想知道不删除事件侦听器是否是其中一种方法。
【问题讨论】:
标签: actionscript-3
removeEventListener 和 dealloc 一样必要吗?
我知道在 AS3 中可能会出现内存泄漏,我只是想知道不删除事件侦听器是否是其中一种方法。
【问题讨论】:
标签: actionscript-3
是的,我创建了一个巨大的项目,没有移除任何 eventListener,而且在长时间使用后它确实获得了很多内存......
在强引用被移除之前,任何具有强引用的对象都不会被垃圾回收......这适用于事件监听器、绑定等......
您可以使用removeEventListener(Event.TYPE, function) 手动删除EventListener
或者使用weakReference...
使用 WeakReference 添加事件侦听器您只需向 addMethod 添加更多参数...
obj.addEventListener(Event.Type, Function, false, 0, true)
addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
参数:
type事件的类型。
listener处理事件的监听函数。此函数必须接受一个事件对象作为其唯一参数,并且必须
返回任何内容,如以下示例所示:
function(evt:Event):void函数可以有任何名称。
useCapture 确定侦听器是在捕获阶段还是在目标和冒泡阶段工作。如果 useCapture 设置为 true,
侦听器仅在捕获阶段处理事件,而不是 在目标或冒泡阶段。如果 useCapture 为 false,则侦听器 仅在目标或冒泡阶段处理事件。到 监听所有三个阶段的事件,调用 addEventListener() 两次,一次将 useCapture 设置为 true,然后再次使用 useCapture 设置为 false。
priority 事件监听器的优先级。优先级由 32 位整数指定。数字越高,越高 优先级。优先级为 n 的所有侦听器都先处理 优先级为 n-1 的侦听器。如果两个或多个听众共享相同的 优先级,它们按照添加的顺序进行处理。 默认优先级为 0。
useWeakReference 确定对侦听器的引用是强引用还是弱引用。强引用(默认)可防止您的 听众被垃圾收集。弱引用不会。
类级成员函数不受垃圾影响
【讨论】:
是的,因为您将一个实例“绑定”到另一个实例的范围内。因此,当错误地处理事件时,您将在整个应用程序中获得交叉引用,并且垃圾收集器将找不到任何可以从内存中释放的对象。
【讨论】: