Actionscript 3释放类变量

时间:2010-01-10 17:42:15

标签: actionscript-3 performance garbage-collection

假设我有一个如下所示的类结构,其中我有一个临时子项,显示并稍后替换,因此不再需要。但是,由于多个方法之前访问过该子节点,我需要将其作为类变量。

因此,在替换该子项后,我不再需要它并希望允许垃圾收集重用该空间。由于变量是类变量,我不能使用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:访问精灵一次 - &gt; B大约是A
  • 的三倍
  • 测试2:删除精灵(removeChild vs. removeChildAt) - &gt;几乎相等,没有可见的性能加上仅使用索引(并跳过搜索对象)
  • 测试3:多次访问精灵 - &gt; A比B
  • 快约20%
  • 测试4:与2相同,但是有额外的精灵填满了childList(所以removeChild实际上必须搜索) - &gt; B比A快(比预期的)快25%

由于我只删除了一次元素,但必须多次访问它,我会坚持使用选项A(基本上就像上面的代码一样)。

1 个答案:

答案 0 :(得分:1)

您的代码首先没有显示保留“tempChild”的理由。假设你需要它,那么,是的,为tempChild分配null将允许tempChild引用的对象被GCed(只要不存在对它的其他引用)。但是,当你可以简单地引用this的第一个孩子时,为什么要使用“tempChild”?