Flash AS3 - объект не получает нулевое значение - PullRequest
2 голосов
/ 13 мая 2009

У меня есть система меню, встроенная во Flash, которая позволяет вам выбирать элемент и перемещать его вверх или вниз. Если объект будет удален из меню, я хочу, чтобы для выбранного элемента было установлено значение null, поэтому он больше не будет пытаться перемещаться.

У меня есть глобальная (для временной шкалы текущего клипа) переменная:

var selectedPlaylistItem:MovieClip;

Сохраняет, какой пункт меню выбран (пункты меню - это просто фрагменты фильмов), и если этот элемент удаляется, я устанавливаю для выбранного элемента значение NULL:

function removeFromPlaylist(sender:playlist_content_item) {
    if(sender == selectedPlaylistItem) {
        //Not sure why this isn't working, but at some point I need to figure it out.
        selectedPlaylistItem = null;
        trace(selectedPlaylistItem);

Эта трассировка будет показывать ноль без каких-либо проблем, но в моей следующей функции, которая перемещает элементы вверх, после того, как я установил ее на нуль, она все равно будет установлена ​​на объект, который был до удаления:

function playlistUp(sender:MovieClip) {
    trace(selectedPlaylistItem);

Этот след покажет исходный объект.

Кто-нибудь знает, почему это не сработает? Почему бы просто не остаться нулевым после того, как он был установлен таким образом?

Спасибо


UPDATE:

Итак, я попробовал это, чтобы увидеть, смогу ли я понять, что происходит:

    this.selectedPlaylistItem = null;
    trace(selectedPlaylistItem);
    setTimeout(function() {trace(selectedPlaylistItem);}, 4000);

Но когда трассировка происходит через 4 секунды, она говорит, что это все еще выбранный объект, хотя трассировка сразу показывает его как нулевой, и я искал повсюду в коде, но нигде не было бы сброса.

Ответы [ 5 ]

1 голос
/ 13 мая 2009

Где этот код «живет»? Если он находится на временной шкале, ваш код, устанавливающий selectedPlaylistItem, может быть вызван снова, в любом случае, я бы добавил некоторые следы или точки останова в то место, где вы установили selectedPlaylistItem, чтобы увидеть, вызывается ли он неожиданно.

1 голос
/ 13 мая 2009

Из того, что я вижу, оно должно оставаться нулевым. Можете ли вы опубликовать какой-нибудь другой код, т. Е. В каком контексте эти две функции вызываются?

0 голосов
/ 21 мая 2009

Если selectedPlaylistItem отображается на экране во время запуска removeFromPlaylist(), попробуйте удалить объект из списка отображения перед тем, как обнулить его.

0 голосов
/ 16 мая 2009

Ваш код содержит более двух кадров или более? Я предполагаю, что он снова запускает код. Таким образом, в ходе выполнения сценария он будет установлен в нуль, пока текущий кадр еще не визуализируется, но если он возвращается к (скажем) кадру 1, то он может быть вызван каким-то кодом для повторной установки этой переменной, следовательно через 4 секунды вы увидите, что оно настроено на что-то.

0 голосов
/ 13 мая 2009

Все ли слушатели событий были удалены с объекта и / или вы используете Слабые ссылки ?:

Слабым эталоном является тот, который не учитывается сборщиком мусора (т. Е. Он не учитывается при подсчете ссылок и не используется для очистки метки). Это означает, что если единственные ссылки, оставшиеся на объект, являются слабыми, он будет доступен для сбора при следующей очистке GC.

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

// params: eventName, listener, capturePhase, priority, useWeakReference
someObj.addEventListener("eventName",myFunct,false,0,true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...