我希望mc被删除所有的计时器,事件,...有一个简单的方法吗?
答案 0 :(得分:11)
确定...取消注册其计时器和事件,将其从父项中删除,并删除对它的所有引用。 ;)
也就是说,AS3是一种垃圾收集语言,因此您无法控制何时从内存中删除某个对象(包括MC) 。当您删除对它的所有引用(包括事件注册)时,GC将检测到不再需要它并为您清理它。
您可以(而且应该)做的一件事是,无论何时注册事件,都要将useWeakReference
参数设置为true
。那就是:
myMC.addEventListener( Event.ENTER_FRAME, onFrame, false, 0, true );
这告诉AS3这个特定的事件监听器不应该作为引用计数 - 所以如果你删除对MC的所有其他引用,即使你没有取消注册监听器,它也会被垃圾收集。 (至于计时器,如果你正在使用setTimeout或setInterval,据我所知它们也不被认为是引用。但我不确定。)
所以它的长短不一样,没有办法让你的MC变得更好,并让Flash清理一切。这就是AS3的工作原理 - 管理您的参考和事件是尽责编码的一部分。如果您的MC没有更多的计时器或事件,将从其父级中移除,并且代码的任何部分都不会引用它,那就是它已经消失。
答案 1 :(得分:2)
Loader.unloadAndStop()
引自http://www.gskinner.com/blog/archives/2008/07/additional_info.html:
以下是unloadAndStop为准备收集的SWF所做的事情列表:
请注意,上述所有内容都是递归运行的,因此它们也适用于任何嵌套的子代,包括其他加载的SWF。
答案 2 :(得分:1)
我看到一些事件,尤其是Timer事件,在useWeakReference
设置为true时无法触发。所以,要小心fenomas的建议。我通常在我的MovieClip和addEventListener(Event.REMOVED_FROM_STAGE, dealloc);
中创建一个dealloc函数。当你removeChild()
那个MovieClip时,dealloc函数会激活。
使用Flash自己处理这些内容是一种很好的做法,尤其是当出现比我们想要更频繁出现的不一致时。
答案 3 :(得分:1)
Jeremy,为了防止您的事件没有被解雇,请确保您的物品在某个地方有参考。
E.G。我创建了一个预加载器类,它从第1帧的根时间轴调用命令:
new PreLoader(root);
此时没有对PreLoader的外部引用,任何_rootClip.loaderInfo.addEventListener(ProgressEvent.PROGRESS,fn)都将失败。 (_rootClip是我的PreLoader类的属性,它的根作为参数传递。)
我做的很简单:
因为我为加载栏制作了一个影片剪辑,并将这个影片剪辑附加到根目录,所以这个影片剪辑有一个参考。
我只是myMC.preloader = this;
来引用我的预加载器并阻止我的事件被删除。
一旦我完成了预加载,一个简单的_rootClip.removeChild(myMC);
就会删除所有内容:)