Squeak.ru - шаблоны программирования

Свойство null доступно только для чтения

Это может быть не нулевое свойство, но вот в чем дело: допустим, у меня есть этот код -

1. someclipthatsinanarray[i].addEventListener(Event.ENTER_FRAME, arrayframe);
2. function arrayframe(e:Event):void
3. {
4. e.currentTarget.removeEventListener(Event.ENTER_FRAME, arrayframe);
5. e.currentTarget.parent.removeChild(e.currentTarget);
6. e.currentTarget = null;
7. }

- и обратите внимание на шестую строку. Я запускаю это в отладчике и получаю эту ошибку:

Error 1119: Line 6, arrayframe: Property is read - only.

Что только для чтения? Если null только для чтения, то почему?


  • Когда присваивание говорит, что оно ничего не может сделать из-за только чтения, оно обычно относится к левому операнду, поэтому в вашем примере e.currentTarget доступно только для чтения. Я понятия не имею, как actionscript может вам помочь. 29.04.2013

Ответы:


1

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

Не волнуйтесь, как только все функции, прослушивающие это конкретное событие, завершат выполнение своего кода, ссылка на ваш клип, хранящаяся в событии, будет удалена сборщиком мусора.

29.04.2013
  • Итак, вы говорите, что я должен вызывать = null ПОСЛЕ того, как я вызываю removeEventListener? Разве это не то, что я делаю? 29.04.2013
  • Нет, он говорит, что вам вообще не нужно = null, так как после обработки события ссылка на удаленное вами movieclip удаляется сборщиком мусора. 29.04.2013
  • О, я понимаю, потому что однажды я вызвал (if(e.currentTarget == null)) с тем же самым внутри его фрейма, потому что я получал ошибку, но это привело к «ложи». 29.04.2013

  • 2

    currentTarget является свойством Event. Оно доступно только для чтения, и вы не можете изменить это свойство.

    Вот что, я думаю, вы хотите сделать:

    someclipthatsinanarray[i].addEventListener(Event.ENTER_FRAME, arrayframe);
    
    // event handler
    function arrayframe(e:Event):void
    {
        var clip:MovieClip = e.currentTarget as MovieClip;
    
        clip.removeEventListener(Event.ENTER_FRAME, arrayframe);
        clip.parent.removeChild(clip);
        clip = null;
    }
    

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

    clip = null;

    clip был просто локальной ссылкой на этот MovieClip, точно так же, как элемент в массиве является просто ссылкой на MovieClip. Таким образом, установка clip в null не является удалением MovieClip, это просто обнуление нашей ссылки, что на самом деле даже не нужно, поскольку это локальная переменная, и ее область действия заканчивается после завершения обработчика.

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

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

    29.04.2013
  • Скорее всего, это сработает, но по какой-то причине я получаю другую ошибку, когда вызываю e.currentTarget как MovieClip = null;. Это ошибка: «Ошибка 1050: невозможно присвоить значение, не являющееся ссылкой». 29.04.2013
  • Я повторяю, что вы НЕ МОЖЕТЕ изменить это свойство. Вы МОЖЕТЕ изменить объект, на который ссылается свойство. 29.04.2013
  • Стоит отметить, что на самом деле это не приведет к обнулению исходного объекта. Вместо этого он просто обнуляет ссылку на память (в данном случае clip) на этот объект. 30.04.2013
  • Это правильно и очень хороший момент. Ни один объект не помечен для сборки мусора, пока не останется ссылок. 30.04.2013
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...