Я делаю чистку ссылки AS3 правильно? - PullRequest
0 голосов
/ 20 мая 2010

В одном кадре моего fla-файла (назовем его кадром 2) я загружаю несколько XML-файлов, а затем отправляю эти данные в класс, который инициализируется в этом кадре, этот класс создает несколько таймеров и слушателей.

Тогда, когда этот класс закончил, он работает. Я вызываю dispatchEvent и перехожу к кадру 3. Этот кадр также делает некоторые вещи, он инициализируется и создает несколько прослушивателей событий и таймеров. Когда это будет сделано, я снова перейду к кадру 2.

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

Для спрайтов я делаю это.

world.removeChild(Background); // world is the parent stage
Background = null;

Для экземпляров других классов я делаю это.

Players[i].cleanUp(world); // do any cleanup within the instanced class
world.removeChild(PlayersSelect[i]);

Для слушателей событий я делаю это.

if(Background != null)
{
    Background.removeEventListener(MouseEvent.CLICK, deSelectPlayer);
}

Для таймеров я делаю это.

if(Timeout != null)
{
    Timeout.stop();
    Timeout.removeEventListener(TimerEvent.TIMER, queueHandler);
    Timeout.removeEventListener(TimerEvent.TIMER_COMPLETE, queueCompleted);
    Timeout = null;
}

И для библиотечных изображений я делаю это

if(_libImage!= null)
{
    s.removeChild(Images._libImage); // s is the stage
    _libImage= null;
}

А для самого класса в основной временной шкале я делаю это

Frame2.removeEventListener("Done", IAmDone);
Frame2.cleanUp(); // the cleanup() does all the stuff above
Frame2= null;

Даже если я сделаю все это, когда я попаду во второй кадр во 2-й раз, он будет работать в течение 1-2 секунд, а затем я получаю множество ошибок нулевых ссылок, поскольку функция очистки вызывается преждевременно.

Правильно ли я делаю уборку?

Что может вызвать преждевременное срабатывание событий?

Ответы [ 2 ]

2 голосов
/ 20 мая 2010

Для меня самой большой проблемой является очистка слушателей, что вы и делаете. Чтобы избежать каких-либо ошибок при очистке слушателя, я всегда проверяю, существует ли элемент, а затем, если у него есть слушатель; таким образом:

if(item)
{
   if(item.hasEventListener(MouseEvent.CLICK))
   {
      item.removeEventListener(MouseEvent.CLICK,doSomething);
   }
}

Я проверяю симлимала перед удалением ребенка:

if(item)
{
   if(this.contains(item))
   {
      this.removeChild(item);
      item.destroy()//or whatever you code is to clear that element of its own dependencies.
      item = null;
   }
}
0 голосов
/ 21 мая 2010

Если вы хотите, чтобы сборщик мусора мог очистить ваши объекты после того, как вы установили для них значение null.Затем, когда вы добавляете в EventListener слабую ссылку, это позволяет сборщику мусора собирать его, когда его значение равно нулю.См. Параметры функции addEventListener:

addEventListener(type:String, 
                 listener:Function,
                 useCapture:Boolean = false, 
                 priority:int = 0, 
                 useWeakReference:Boolean = false)

Так что для того, чтобы у вас не было нулевых ссылок, вы должны установить последний параметр в false.

addEventListener(MouseEvent.MOUSE_OVER, function(), false, 0, true);
instead of
addEventListener(MouseEvent.MOUSE_OVER, function());

Если у вас есть сильные ссылки на EventListeners, вы должны вручную удалить их с помощью функции removeEventLister перед удалением объекта, на который есть ссылка.что даже если элемент равен нулю, сильная ссылка все еще там, и нулевые указатели все еще могут иметь место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...