![]() |
Создание объекта без ключевого слова var
Увидел такой код в статье про MVC:
Код AS3:
Код AS3:
Получается, можно создавать экземпляры объектов напрямую через new без ключевого слова var ? Какие подводные камни при этом существуют, и каким из двух способов и когда стоит пользоваться? |
В первом случае у вас не будет ссылки на объект. Соответственно вы ничего не сможете с ним сделать (если он сам себя не добавить куда-нибудь), и при первой возможности GC его удалит.
|
Но хуже то, что первый будет доступен для сборщика с момента создания.
|
Про GC: очень типичная ошибка.
Hint: что будет, если объект в конструкторе подпишется на события? Или просто использует переданный ему в конструкторе параметр и заассайнит этому объекту ссылку на себя? |
Будет то, что написано в скобках. Появится ссылка на объект, со всеми вытекающими.
|
Не забывайте про
Код AS3:
Конструктор - это, если грубо говоря, функция, которая возвращает экземпляр класса. Хотя конструктор - это не функция и не метод, это конструктор, если занудничать. |
Цитата:
Когда стоит пользоваться? Когда результат new передается параметром в другой метод. Код AS3:
|
Всем спасибо
|
Crazy
Наличие подписки на событие не является критерием для исключения из списка сборщика (для этого пишут деструкторы, хотя в AS3 их нет в явном виде). Я думаю, что это также распространенная ошибка, не отписывать удаляемый объект и забывать отключать в нем таймеры и останавливать каретку (и тоже для детей). (тоесть, даже после присвоения null все процессы в экземпляре буду протекать как и раньше) |
Цитата:
|
etc
Под подпиской, я подразумевал наличие приемника. Простите. |
Цитата:
|
Crazy
В чем противоречие? Объект создан и ссылка на объект присвоена некой переменной. Подписан как приемник. Ссылка на объект обнулена. //с этого момента объект доступен для сборки Объект продолжает принимать сообщения.//в этом и есть ошибка, надо было отписать его до удаления ссылки Объект удален сборщиком. |
Объект подписан как приемник = у источника в массиве listeners есть на него ссылка.
|
Цитата:
|
Цитата:
|
i.o.
Точно. Все никак не мог вспомнить. Знал что есть ссылки в таблице слушателей, и знал что несмотря на это слушатель может быть удален, но почему - забыл. useWeakReference Вот код что ввел меня в заблуждение: Код AS3:
Код:
Sprite 1 742 32137216 |
Цитата:
|
etc
Ммм...не совсем понял. Что не будет работать? Этот трейс я не руками писал, это то что выводится в консоль...(ну, за исключением "забрал" =)) |
Цитата:
|
Ну. Проверьте код.
У меня работает. На CS4 и CS5. |
Цитата:
|
Цитата:
Цитата:
Этот код удаляет ссылку через 5 секунд: Код AS3:
Код:
Sprite 1 1166 27508736 |
@S-ed
когда Вы делаете Код AS3:
Если бы мы написали вот так Код AS3:
|
S-ed, если ваш код скопипастить без изменений, никакого удаления Sprite 2 из памяти не будет. Если у вас вдруг пропал трейс с Sprite 2, при этом код не меняли — у вас битая память компьютера или кривой Flash Player.
|
gloomyBrain
Да, я знаю как это работает. О, заодно вопрос, как защитить documentClass от сборки? На него как раз, как Вы сказали, нет ссылок...или он не собирается? etc Вот в том и дело, что у меня на 2х машинах "битая память". >_< |
А, пардон, всё верно, GC работает, на s2 ссылок нет.
|
Цитата:
|
gloomyBrain
Понятно. У меня как раз его нет в дисплей листе (в том который проверял на GC). А как его туда добавить? Ведь документКласс должен быть чайлдом чего-то... |
Добавьте, addChild ) Jul 2001 это сильно!
|
dimarik
Я тупил. Добрый человек, подсказал. ЧТО НАДО СОХРАНЯТЬ AS ФАЙЛЫ ПЕРЕД КОМПИЛЯЦИЕЙ! Я как дятел половину кода проверял без сохранения (приучен студией). Document Class нельзя добавить как addChild,- просто некуда. (как мне популярно объяснили, он сам добавляется в дисплей лист) Дата? Да. Раньше хотел изучить, да все никак... Теперь вот все с нуля учу, бо AS3 совсем другой. |
А Вы чем собираете? FlashDevelop сам все сохраняет перед сборкой (да все что угодно, кроме Flash IDE)
|
Цитата:
|
Цитата:
|
gloomyBrain
ИДЕ собирал. FD только начал осваивать, жаль не имеет своего компилятора. goodguy Не не не, приведенный код работает как я и описывал, тоесть спрайт 2 собирается коллектором. Я проверял на других машинах, а там небыло необходимости сохранять что-либо. dimarik Тоесть его можно опустить ниже по дереву? Или поднять выше из лоадера? |
| Часовой пояс GMT +4, время: 05:20. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.