在文档类上销毁/处置方法

时间:2011-02-01 14:20:06

标签: actionscript-3 garbage-collection

您是否需要在文档类上使用destroy / dispose方法?

假设我有一个包含以下内容的文档类

- mouse event listeners
- timers running and or enter_frame listeners
- class variables

我是否需要使用销毁或处置方法:

- removes event listeners
- stops timers
- nulls class variables

或者这只是我在其他对象(精灵,动画片段)中需要添加到Document类阶段的东西吗?

2 个答案:

答案 0 :(得分:3)

作为一般规则,如果您的类的实例将被“丢弃”,那么拥有dispose()方法是件好事。 Flash中没有finalize()(与Java不同)所以你需要一个地方来清理它。

需要清理的内容:

  1. 必须停止运行计时器
  2. 必须删除
  3. 'enterFrame'事件侦听器
  4. 应关闭开放式网络连接
  5. 必须删除添加到舞台上的所有儿童
  6. 必须删除舞台事件侦听器
  7. 必须处理
  8. 的BitmapData对象
  9. 必须停止播放声音
  10. ......等等。

    如果不这样做,最终可能会出现严重的内存泄漏。

答案 1 :(得分:3)

通常,您不需要拥有这样的方法,因为只要您的应用程序处于活动状态,文档类所代表的对象就会存在。但是,情况不一定如此。例如,如果你有“stub”swfs,你可能想要在卸载时清理它们。调用者可以在装载你的swf的Loader上调用unloadAndStop(对于flash player> = 10),但我认为清理它仍然是一个好主意。

执行此操作的一种简单方法是利用ADDED_TO_STAGE和REMOVED_FROM_STAGE事件。也就是说,无论何时将对象添加到舞台中,都要执行所需的所有初始化。当它被删除时,请进行清理。像这样:

import flash.display.MovieClip;
import flash.events.Event;

public class YourDocClass extends MovieClip {

    public function YourDocClass() {
        addEventListener(Event.ADDED_TO_STAGE,setup);
        addEventListener(Event.REMOVED_FROM_STAGE,cleanup);
    }   

    private function setup(e:Event):void {
        // your setup code here
    }

    private function cleanup(e:Event):void {
        // your cleanup code here
    }
} 

请注意,您无需删除这两个事件侦听器。事实上,如果你只是让他们监听事件,你可以重用该对象(有时需要一点额外的关注,以保持你的对象处于一致状态;使用一个新的实例要简单得多,通常性能打你拿不是问题)