您的1000个Movieclips将在onClick函数中引用到您。而不是相反。
如果您的问题是您的1000个Movieclips是否会被垃圾回收:如果它们没有任何其他引用,它们最终会被回收。
另一方面,您的movieclips对于您的onClick函数的引用将使其保持活动状态(以及可能属于该对象的对象)。如果这些MC具有任何其他引用,那么它们将保持活动状态。
以下代码:
mc.addEventListener(MouseEvent.CLICK , function(ev:Event):void{ trace("I am only a poor anonymous function"); }, false, 0, true);
由于没有强引用,您的监听函数很快就会被垃圾回收。
如果您要将事件侦听器添加到舞台,则将 useWeakReference 设置为true可能非常相关。
stage.addEventListener(MouseEvent.CLICK, someObjectBelowIntheDisplayList.listenerFunction)
上述代码将保持具有监听器功能的对象的存在,即使它没有其他引用。
someObjectBelowIntheDisplayList.addEventListener(MouseEvent.CLICK, stage.onClick)
上面的代码并不会使得你的someObjectBelowIntheDisplayList对象保持活跃状态。它有一个对舞台(stage)的引用,但舞台并没有引用someObjectBelowIntheDisplayList对象。
编辑:请尝试下面的代码:
import flash.display.MovieClip;
import flash.events.Event;
var mc:MovieClip ;
function enterframe(ev:Event):void
{
for ( var i=0 ; i< 1000 ; i++)
{
mc = new MovieClip() ;
mc.onClick = function(ev:Event){};
stage.addEventListener(MouseEvent.CLICK, mc.onClick);
}
}
this.addEventListener(Event.ENTER_FRAME, enterframe);
function onClick(ev:Event):void
{
}
这段代码明确证明了我的说法:使用mc.addEventListener将不会增加内存消耗。在我的系统上,它将保持在20MB左右。
当使用stage.addEventListener并将mc.onClick作为侦听器函数时,内存消耗将每帧增加。