实例化扩展类时的AS3内存管理

时间:2010-05-16 19:33:12

标签: actionscript-3 inheritance memory-management class

我正在开发一个AS3应用程序,它有一些我无法找到的内存泄漏,所以我想问一些关于内存管理的新手问题。

想象一下,我有一个名为BaseClass的类,以及一些扩展此类的类,如ClassA,ClassB等。

我声明了一个变量:

myBaseClass:BaseClass = new ClassA();

过了一会儿,我用它来实例化一个新对象:

myBaseClass = new ClassB(); 

之后的某个时间

myBaseClass = new ClassC(); 

并且每个x毫秒都会发生同样的事情,由计时器触发。

这里有记忆问题吗?垃圾收集器是否正确删除了未使用的实例?

谢谢!

2 个答案:

答案 0 :(得分:1)

假设您有对该实例的其他引用(或者可能是其内容),垃圾收集器将清理它们。但是,据我所知,清理之前的时间是不确定的(可能会有一些困难的时间表在使用,但我从来没有看到它记录在案)。如果您正在创建大量实例,那么在第一次清理之前可能会占用大量内存。

有一个AS调用(其名称目前在逃避我)以强制GC运行,但通常不需要它。如果您认为有必要,您几乎肯定需要重新考虑您的应用程序的工作方式。

答案 1 :(得分:0)

如果myBaseClass是唯一存储的

引用
  

new ClassA()

并为myBaseClass指定其他内容

  

new ClassB()

然后将没有指向ClassA的引用,垃圾收集器应该在运行时找到它。

但是,如果你将myBaseClass提供给存储它自己对该对象的引用的库或类,当你重新分配myBaseClass时,仍然会有一个指向ClassA的引用,垃圾收集器不会清理它,创建一个内存泄漏。通常,编写良好的库将为您提供删除引用的方法。 e.g。

var child:Sprite = new Sprite()
// one reference to the new Sprite

stage.addChild(child); // assume stage stores reference
// two references to the new Sprite

/**
 * assume the following:
 *
 * child = null; 
 *
 * one reference would still remain in stage
 * garbage collector will not clean up the sprite
 */

stage.removeChild(child); // assume stage clears reference
// one reference left
child = null;
// no reference to the sprite, garbage collector will clean it up

希望这会让事情变得清晰起来。基本上你想跟踪一个对象有多少引用,如果你怀疑它是在泄漏内存。

我知道FlashDevelop有一个分析器,对于发现这些错误非常有用。此外,您需要知道当垃圾收集器运行时...它将释放内存并为您的内存分析器提供锯齿图案。