【问题标题】:Forcing SWF to free allocated memory from codes on FLA timeline强制 SWF 从 FLA 时间线上的代码中释放分配的内存
【发布时间】:2026-02-19 02:20:06
【问题描述】:

我有一个 Flash 项目,我在时间轴上编写了一些代码。当我加载 SWF 文件并卸载它时,分配的内存仍然存在,并且每次加载和卸载它时都会发生内存泄漏。

有解决办法吗?

我试过了,但是内存不是空闲的。

addEventListener(Event.REMOVED_FROM_STAGE, removed);

public function removed(evt:Event) {
    removeEventListener(Event.REMOVED_FROM_STAGE, removed);
    csc = null;
    if (currentFrame == 2) {
        content.removelisteners3()
        try {
            content.removeChildren();
        } catch (e:Error) {
        }
        menu.removeListeners1();

        try {
            mc1.mc.removeChildren();
        } catch (e:Error) {
        }
        try {
            mc1.removeChildren();
        } catch (e:Error) {
        }
    }

    if (currentFrame == 3) {
        menu.removeListeners2()
        try {
            search_ctn.removeChildren()
        } catch (e:Error) {
        }
        try {
            min_search.removeEventListener(MouseEvent.MOUSE_UP, f_min_search);
        } catch (e:Error) {
        }
        try {
            clos_search.removeEventListener(MouseEvent.MOUSE_UP, f_clos_search);
        } catch (e:Error) {
        }
        try {
            btnUpSearch.removeEventListener(MouseEvent.MOUSE_DOWN, f_btnUpSearch);
        } catch (e:Error) {
        }

    }
    try {
        this.removeChildren();
    } catch (e:Error) {
    }
}

【问题讨论】:

  • 这种方法看起来相当蛮力 - 也许隔离处置功能可能会有所帮助,例如在菜单和搜索中。使用像 Adobe Scout 这样的分析器来提供帮助。
  • 您可能没有从stage 中删除所有侦听器。另外,检查System.gc()是否释放内存,但首先让它运行,因为gc()调用不会强制GC运行,而是告诉Flash播放器“嘿,你为什么不现在运行GC?”,哪个 FP 可以忽略。
  • @jason:首先感谢您安排我的代码。这是以前程序员的旧文件,我知道结构设计不正确,但我需要在不改变结构的情况下尽快修改它。我不知道 adobe scout 是什么以及它如何帮助我:(
  • @Vesper 我已尝试删除所有侦听器,但仍有问题,内存泄漏仍在发生
  • 你(或任何人)不应该使用框架。不要将代码放在框架上,使用框架来运行代码等。仅将框架用于动画。保存对所有内容的引用。当您应该使用 removeChild(arrayOfReferences[i]) 时,您正在使用 removeChildren()。

标签: actionscript-3 flash memory-leaks


【解决方案1】:

删除内容并不能保证垃圾收集器确实释放了内存。只要一个内存位置有对它的引用,它就会一直存在并且......

【讨论】: