假设我有一个类似于下面的类结构,在那里我有一个临时的子类,它被显示出来,随后被替换,因此不再需要。但是,由于以前有多个方法访问该子级,所以我需要它是一个类变量。
因此,在替换了该子级之后,我不再需要它,并且希望允许垃圾收集重用该空间。因为变量是类变量,所以我不能使用
delete tempChild
. 通常,当不再有对垃圾收集的引用时,垃圾收集将释放内存;所以我的问题是,如果只是简单地分配
null
到该变量就足以为其激活GC。
class Test extends Sprite
{
private var tempChild:Sprite;
public function Test ()
{
tempChild = new Sprite();
tempChild.graphics.drawRect( 0, 0, 100, 100 );
this.addChild( tempChild );
}
public function replace ( obj:DisplayObject ):void
{
this.removeChild( tempChild );
tempChild = null; // <-- here I want to free the variable
this.addChild( obj );
}
}
编辑:
刚刚做了一个快速的基准测试,结果如下:
测试类型A:将sprite引用存储为私有类变量
测试类型B:通过子索引访问它(
getChildAt
)
-
测试1:访问sprite
一旦
->b大约是a的三倍慢
-
测试2:删除sprite(removechild与removechildat)->几乎相等,仅使用索引(并跳过对对象的搜索),没有可见的性能增强。
-
测试3:多次访问sprite->A比B快20%
-
测试4:与2相同,但在子列表中添加了其他精灵(因此removechild实际上必须搜索)->b比a快25%(如预期的那样)
因为我只删除元素一次,但必须多次访问它,所以我将坚持使用选项A(基本上类似于上面的代码)。