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