代码之家  ›  专栏  ›  技术社区  ›  poke

操作脚本3释放类变量

  •  0
  • poke  · 技术社区  · 15 年前

    假设我有一个类似于下面的类结构,在那里我有一个临时的子类,它被显示出来,随后被替换,因此不再需要。但是,由于以前有多个方法访问该子级,所以我需要它是一个类变量。

    因此,在替换了该子级之后,我不再需要它,并且希望允许垃圾收集重用该空间。因为变量是类变量,所以我不能使用 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(基本上类似于上面的代码)。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Jonathan Feinberg    15 年前

    您的代码并没有显示一开始就坚持使用“tempchild”的原因。假设你 需要它,然后,是的,将空值赋给tempchild将允许tempchild引用的对象被gced(只要不存在对它的其他引用)。但是为什么有“临时工”,当你可以简单地提到 this 第一个孩子?