gpt4 book ai didi

flash - 这段代码会导致内存泄漏吗?

转载 作者:行者123 更新时间:2023-12-04 02:03:26 25 4
gpt4 key购买 nike

这会导致内存泄漏吗?

var mc:MovieClip ; //<<<<<<< OUTSIDE LOOP

for ( var i=0 ; i< 1000 ; i++)
{
mc = new MovieClip() ;
mc.addEventListener( MouseEvent.CLICK , onClick) ;
}

而这个呢?
for ( var i=0 ; i< 1000 ; i++)
{
var mc:MovieClip ; //<<<<<<< INSIDE LOOP
mc = new MovieClip() ;
mc.addEventListener( MouseEvent.CLICK , onClick) ;
}

“removeEventListener”没有在上面的任何代码中使用,所以我认为两者都导致了内存泄漏。

最佳答案

您的 1000 个影片剪辑将引用您的 onClick 函数。不是反过来。
因此,如果您的问题是您的 1000 个 Movieclips 是否会被 GCed:如果他们没有任何其他引用,他们最终会。

另一方面,影片剪辑中对 onClick 函数的引用将使其保持事件状态(以及它可能属于的对象)。如果这些 MC 有任何其他引用可以让他们保持活力。

以下代码:

mc.addEventListener(MouseEvent.CLICK , function(ev:Event):void{  trace("I am only a poor anonymous function");  }, false, 0, true);

很快就会让您的监听器函数 GC,因为它没有任何强引用。

设置 useWeakReference 如果您将 Eventlistener 添加到舞台,则为 true 可能非常相关
stage.addEventListener(MouseEvent.CLICK, someObjectBelowIntheDisplayList.listenerFunction);

上面的代码将使带有监听器函数的对象保持事件状态,即使它没有其他引用。
someObjectBelowIntheDisplayList.addEventListener(MouseEvent.CLICK, stage.onClick)

上面的代码不会保留您的 someObjectBelowIntheDisplayList 活。它有对舞台的引用,但舞台没有获得对 的引用。 someObjectBelowIntheDisplayList

编辑:请尝试以下代码:
import flash.display.MovieClip;
import flash.events.Event;

var mc:MovieClip ; //<<<<<<< OUTSIDE LOOP

function enterframe(ev:Event):void
{
for ( var i=0 ; i< 1000 ; i++)
{
mc = new MovieClip() ;
mc.onClick = function(ev:Event){};
// Use one of the following lines, comment out the other one
//mc.addEventListener( MouseEvent.CLICK , onClick) ; // no memory leak
stage.addEventListener(MouseEvent.CLICK, mc.onClick); // memory will rise up and up
}
}

this.addEventListener(Event.ENTER_FRAME, enterframe);

function onClick(ev:Event):void
{

}

这段代码清楚地支持我所说的:使用 mc.addEventListener 将 不是 增加内存消耗。它将在我的系统上保持大约 20MB。
当使用带有 stage.addEventListener 的行并使用 mc.onClick 作为监听器函数时,内存消耗将每帧增加。

关于flash - 这段代码会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com