Проблема с прослушивателем событий добавлена ​​слабой ссылкой в ​​ActionScript - PullRequest
3 голосов
/ 29 августа 2011

Моя проблема в основном заключается в следующем. Есть экземпляр класса, расширяющего EventDispatcher. Все идет хорошо, когда я добавляю прослушиватель событий к объекту так:

myObject.addEventListener('eventName', someFunction, false, 0, false);

Но что-то меняется, когда слушатель события добавляется по слабой ссылке:

myObject.addEventListener('eventName', someFunction, false, 0, true);

Теперь someFunction не вызывается, даже если строка, содержащая dispatchEvent ('eventName'), выполняется так же, как и раньше (и есть также внешняя ссылка на myObject).

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

Ответы [ 2 ]

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

Думаю, вы неправильно понимаете, как работает GC. Использование слабой ссылки не определит myObject. Это может (возможно, не обязательно) предотвратить область, в которой обработчик объявлен для сбора (пока жив myObject). Следовательно, сам обратный вызов может быть собран, в результате чего он не будет выполнен. Похоже, это тот случай, согласно вашему описанию.

Таким образом, ваша цель состоит в том, чтобы избежать сбора декларации someFunction. Одним из способов может быть использование жесткого рефери (если вы спросите меня, в любом случае слабые реферы - плохая идея). Могут быть и другие, но я не знаю, как структурировано ваше приложение, поэтому не могу сказать много.

Изменить для адреса комментария.

GC мудро, обработка событий не отличается от общего случая. Когда вы добавляете прослушиватель, вы передаете ссылку диспетчеру (ссылка - это область, в которой объявлен прослушиватель). В диспетчере хранится эта ссылка, чтобы при необходимости он мог выполнить обратный вызов. Это действительно не так уж отличается от этого:

myObject.keepThisReference = someFunction;

Теперь myObejct имеет ссылку на someFunction. Таким образом, пока myObject жив, someFunction также будет жив (если вы не установите someFunction в качестве слабого реф).

Итак, чтобы ответить на вопрос в вашем комментарии (объект не упоминается где-либо еще, но к нему прикреплен прослушиватель событий), учитывая этот сценарий:

myObject.addEventListener('someEvent',someFunction);

Если myObject не имеет никакой другой ссылки и выходит за рамки, то может быть для сбора.

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

Если другой ссылки на myObject нет, она будет собрана, когда функция, в которой вы находитесь, выйдет из области видимости.Либо измените код, чтобы он не был слабым слушателем, либо убедитесь, что есть ссылка на myObject где-то еще в коде

...