Actionscript 3 освобождает переменные класса - PullRequest
0 голосов
/ 10 января 2010

Предположим, у меня есть структура классов, подобная следующей, где у меня есть временный дочерний элемент, который отображается, а затем заменяется и, как таковой, больше не нужен. Однако, поскольку несколько методов обращаются к этому дочернему элементу раньше, мне нужно, чтобы он был переменной класса.

Так что после замены этого потомка он мне больше не нужен, и я хочу разрешить сборке мусора повторно использовать это пространство. Поскольку переменная является переменной класса, я не могу использовать 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 );
    }
}

edit: Только что сделали быстрый тест для этого, результаты ниже:

Тип теста A: сохранение ссылки Sprite в качестве переменной частного класса
Тип теста B: доступ к нему через дочерний индекс (getChildAt)

  • Тест 1: Доступ к спрайту один раз -> B примерно в три раза медленнее, чем A
  • Тест 2: Удаление спрайта (removeChild и removeChildAt) -> почти равно, нет видимой производительности плюс использование только индекса (и пропуск поиска объекта)
  • Тест 3. Доступ к спрайту несколько раз -> A примерно на 20% быстрее, чем B
  • Тест 4: То же, что и 2, но с дополнительными спрайтами, которые заполняют childList (так что removeChild должен искать) -> B примерно на 25% быстрее, чем A (как и ожидалось)

Поскольку я удаляю элемент только один раз, но мне приходится обращаться к нему несколько раз, я буду придерживаться варианта A (который в основном похож на приведенный выше код).

1 Ответ

1 голос
/ 10 января 2010

Ваш код не показывает причину удерживать "tempChild" в первую очередь. Если вы действительно нуждаетесь в этом, то да, назначение null для tempChild позволит объекту, на который tempChild ссылается, быть GCed (если нет других ссылок на него). Но зачем использовать tempChild, когда вы можете просто сослаться на первого ребенка this?

...