Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.12.2015, 02:56
romanlysenko вне форума Посмотреть профиль Отправить личное сообщение для romanlysenko Найти все сообщения от romanlysenko
  № 1  
Ответить с цитированием
romanlysenko
 
Аватар для romanlysenko

Регистрация: May 2015
Сообщений: 19
По умолчанию Удаление событийного объекта

Всем привет!
Кто может подсказать следующее:
всем знаком метод и событийный объект:
Код AS3:
addEventListener(Event.ADDED_TO_STAGE, onStage);
допустим я его зарегистрировал в конструкторе основного класса Main:
Код AS3:
public function Main():void {
    addEventListener(Event.ADDED_TO_STAGE, onStage);
}
после того как вызывается метод onStage:
Код AS3:
private function onStage(e:Event = null):void {
    removeEventListener(Event.ADDED_TO_STAGE, onStage);
 
    addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
мы видим что событийный объект Event.ADDED_TO_STAGE передаваемый в качестве аргумента в параметр e метода onStage тут же принимает значение null (удаляется из памяти), а в теле самого метода/функции onStage удаляется слушатель данного события removeEventListener(Event.ADDED_TO_STAGE, onStage) и это понятно, но меня интересует собственно сам параметр e и присваиваемое ему значение null. Вот сама суть вопроса: я зарегистрировал в методе onStage слушатель события на соб. объект Event.ENTER_FRAME, вызываю метод onEnterFrame и в его параметре присваиваю событийному объекту значение null как с методом onStage:
Код AS3:
private function onEnterFrame(e:Event = null):void {
    ...
}
Все работает, никаких ошибок...
Но правильно ли это, присваивать каждый раз параметру функции onEnterFrame значение null?
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. ©

Старый 22.12.2015, 03:09
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 2  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
вы присваиваете объект события в переменную. так же можете ее и обнулить. сам объект при этом никуда не девается. а эта конструкция означает что по умолчанию переменная e равна null(если функция вызвана без аргумента)

Старый 22.12.2015, 03:23
romanlysenko вне форума Посмотреть профиль Отправить личное сообщение для romanlysenko Найти все сообщения от romanlysenko
  № 3  
Ответить с цитированием
romanlysenko
 
Аватар для romanlysenko

Регистрация: May 2015
Сообщений: 19
Ах да, точно, торможу немного...
Тогда изменим пример, точнее просто добавим в тело функции onEnterFrame следующий код:
Код AS3:
private function onEnterFrame(e:Event = null):void {
    e = null;
}
Ну теперь уже точно параметр e содержит соб. объект Event.ADDED_TO_STAGE и в теле самого метода обнуляет его, верно?
И опять вопрос, правильно ли это, стоит ли так писать и удаляет ли сборщик мусора каждый раз эту локальную переменную, да и вообще освобождается хоть чуть-чуть память?
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. ©

Старый 22.12.2015, 06:43
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Нет, не верно. Это всего навсего локальная переменная, и присвоение ей значения null ничего не дает.
Да и вообще, присвоение null значения означает всего-лишь зануление ссылки на объект в конкретном месте. Это ни в коем случае не удаляет ничего из памяти и не означает, что на него нет других ссылок и он доступен для сборщика мусора. В as3 вообще нет средств для удаления чего-либо из памяти вручную. Если на объект занулить все ссылки, то он становится доступным для сборщика мусора, но и это не означает, что он его сразу удалит. Удаления мусора - это довольно ресурсозатратная операция, поэтому он копит определенное количество, и только после превышения разрешенного объема, начинает процесс удаления.
Во время удаления мусора может легко провисать FPS или приложения может даже вообще на какое-то время остановиться, поэтому лучше не избавляться от ненужных в данный момент объектов, а по возможности использовать пулы. Но событий это не касается. Для них достаточно отписаться от слушателя.

Я бы посоветовал почитать как работают ссылки в C++, там работа с памятью описана гораздо подробнее, и что такое ссылки и адреса в памяти будет намного яснее

Ну и, конечно же, по as3

Старый 22.12.2015, 10:22
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 5  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
Цитата:
Сообщение от caseyryan Посмотреть сообщение
В as3 вообще нет средств для удаления чего-либо из памяти вручную.


А мне вот все таки интересно, почему так? Чем это обосновано, что плохого в самостоятельном управлении памятью?

Старый 22.12.2015, 10:58
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 6  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
В том, что платформа со сбощиком мусора, который занимается тем, что освобождает память, когда объекты никем не используются. Вообще бессымысленно заморачиваться на "удалении" объекта события. Даже если слушателей миллиард, то объект события будет один (за исключение ручного редиспатчинга)

Старый 22.12.2015, 11:01
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от zCHESNOKz Посмотреть сообщение
А мне вот все таки интересно, почему так? Чем это обосновано, что плохого в самостоятельном управлении памятью?
Вряд ли у тебя получится это правильно делать. Если бы адресация и удаление из памяти были такими простыми задачами, никто бы не придумывал разных сборщиков мусора

Старый 22.12.2015, 11:04
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 8  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
romanlysenko

Код AS3:
var a:TextField = new TextField();
var b:TextField = a;
var c:TextField = a;
Переменные "a" "b" "c" лежат в памяти, каждый по своему адресу. Текстфилд тоже лежит по своему адресу. По тем адресам, где лежат переменные, хранится только адрес текстфилда и больше ничего.

То есть переменные сами лежат по каким то адресам и хранят какие-то адреса. А по тому адресу где лежит текстфилд, вот там да - лежит настоящий текстфилд.

Если мы напишем
Код AS3:
a = null;
то по тому адресу где хранится переменная "а" удалится адрес текстфилда, теперь там будет храниться число "0".

В переменных "b" и "c" все еще лежит адрес текстфилда.

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:25.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.