Разъяснения относительно слабых ссылок в слушателях ActionScript - PullRequest
1 голос
/ 29 августа 2011

Я понимаю, как работают слабые ссылки, но я немного озадачен тем, как они используются в обработчиках событий ActionScript.Рассмотрим пример ниже:

public class Rectangle extends MovieClip {
  public function Rectangle() {
    var screen:Shape=new Shape();
    screen.addEventListener(MouseEvent.MOUSE_OUT, new Foo().listen, false, 0, true);
    addChild(screen);
  }
}

public class Foo extends MovieClip {
  public function listen(e:MouseEvent):void {
    trace("tracing");        
  }        
}

Теперь здесь, поскольку существует только слабая ссылка на Foo, не будет ли обработчик событий Foo собираться мусором, если и когда сборщик мусора работает и код перестает работать, как ожидалось?

Предназначен ли сценарий прослушивания слабых событий только для методов прослушивания событий в том же классе, что и ниже?

public class Rectangle extends MovieClip {
  public function Rectangle() {
    var screen:Shape=new Shape();
    screen..addEventListener(MouseEvent.MOUSE_OUT, listen, false, 0, true);
    addChild(screen);
  }

   public function listen(e:MouseEvent):void {
    trace("tracing");        
   }
 }

В этом сценарии помогают слабые прослушиватели событий?

Если объект Rectangle не имеет других ссылок, он является кандидатом на сборку мусора, но поскольку в объекте есть прослушиватель событий, диспетчер событий содержит ссылку на объект, даже если других ссылок нетк объекту (кроме того, который удерживается слушателем события).Следовательно, это предотвращает сбор мусора.Это причина, почему слабые слушатели событий предписаны?Флэш-плеер настолько наивен, что не может понять, что прослушиватель событий определен в одном и том же объекте?

1 Ответ

3 голосов
/ 29 августа 2011

Основное правило для сборки мусора во Flash - это то, что если на объект ссылаются (прямо или косвенно) с временной шкалы, он не может быть собран мусором.Это означает, что если на экземпляр вашего класса не ссылаются нигде в корневом списке отображения (или объекте, который в свою очередь ссылается на корень и т. Д. Рекурсивно), он будет собираться независимо от того, есть ли у него ссылки насама по себе.

Это также означает, что два объекта, которые ссылаются друг на друга, но никак не связаны с корневым списком отображения, должны иметь право на сборку мусора.

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

Итак, в вашем первом примере экземпляр Foo во всех случаях подходит для сборки мусора,Во-вторых, возможность сбора мусора экземпляром Rectangle зависит от того, есть ли на него ссылки из списка отображения.Флаг useWeakReference в этом отношении не имеет значения.

Из документации здесь :

Функции-члены уровня класса не подлежат сборке мусора,так что вы можете установить для useWeakReference значение true для функций-членов уровня класса, не подвергая их сборке мусора.Если вы установите для свойства useWeakReference значение true для слушателя, который является вложенной внутренней функцией, эта функция будет собирать мусор и больше не будет сохраняться.Если вы создаете ссылки на внутреннюю функцию (сохраняете ее в другой переменной), то она не собирается сборщиком мусора и остается постоянной.

...