【问题标题】:AS3 - Memory managementAS3 - 内存管理
【发布时间】:2011-11-07 17:17:04
【问题描述】:

我有一个关于 AS3 内存管理的问题,不知道是否有人可以帮助我。

假设我为一个类创建了一个实例变量,在这种情况下或类型为 Sound:

public class SoundStore extends Sprite{

var s:Sound;

然后在各种类函数中我多次引用这个变量,每次我想加载一个新的声音:

s = new Sound();

我是否正确地认为每次创建新声音时都会覆盖之前分配的内存?

谢谢

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    没有。 AS3 是一种垃圾回收语言,它使用引用计数来处理未使用的对象。

    s 变量在内部是一个指向包含Sound 对象的内存块的指针。每次s = new Sound() AS3 都会在内存中创建一个新的Sound 对象,并将s 指针设置为该对象的地址。旧对象仍然存在于内存中。如果您没有对旧对象的引用,垃圾收集器将在某个时候处理该对象,通常是下一轮收集。这意味着在任何时间点,您都可能在内存中有多个 Sound 对象,这些对象未被引用但仍在使用资源。垃圾收集器的设计目的是定期搜寻所有已分配的对象,如果没有对它们的引用,则将其丢弃。

    这是一篇关于 Flash / AS3 中 GC 的好文章:http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

    【讨论】:

    • 好的,谢谢。我了解我无法具体控制 GC 的运行时间。如果我执行以下操作,这将有助于我的内存管理:try { s = null; } catch (e:Error) {} s = new Sound();
    • 没有。 s 将停止指向 Sound 的那个实例,但它仍然会存在于内存中,直到整个应用程序中没有其他东西指向它。 (这包括事件,除非 useWeakRefereces 设置为 true)。
    • 可以调用 System.gc() 来强制在 Flash 10 及更高版本中进行垃圾收集,但这是一个真的坏主意。它完全破坏了性能,甚至不能保证在调试之外做任何事情。
    • 那么,如果我期望加载多个 MP3 文件,一次一个并播放它们,一次只播放一个,那么设置我的代码的最节省内存的方法是什么。会不会像上面那样,在我创建新的 Sound 并将其分配给 s 之前确保当前的 s 没有指向它的引用?
    • 只需将它的所有引用设置为 null 并照常进行。垃圾收集器将足够频繁地进行循环,以免成为问题。 唯一需要担心的是确保清除所有对它的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2012-03-21
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多