|
|
|||||
Регистрация: May 2015
Сообщений: 19
|
Удаление событийного объекта
Всем привет!
Кто может подсказать следующее: всем знаком метод и событийный объект: допустим я его зарегистрировал в конструкторе основного класса Main: после того как вызывается метод onStage: private function onStage(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, onStage); addEventListener(Event.ENTER_FRAME, onEnterFrame); } Все работает, никаких ошибок... Но правильно ли это, присваивать каждый раз параметру функции onEnterFrame значение null?
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. © |
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
вы присваиваете объект события в переменную. так же можете ее и обнулить. сам объект при этом никуда не девается. а эта конструкция означает что по умолчанию переменная e равна null(если функция вызвана без аргумента)
|
|
|||||
Регистрация: May 2015
Сообщений: 19
|
Ах да, точно, торможу немного...
Тогда изменим пример, точнее просто добавим в тело функции onEnterFrame следующий код: Ну теперь уже точно параметр e содержит соб. объект Event.ADDED_TO_STAGE и в теле самого метода обнуляет его, верно? И опять вопрос, правильно ли это, стоит ли так писать и удаляет ли сборщик мусора каждый раз эту локальную переменную, да и вообще освобождается хоть чуть-чуть память?
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. © |
|
|||||
Нет, не верно. Это всего навсего локальная переменная, и присвоение ей значения null ничего не дает.
Да и вообще, присвоение null значения означает всего-лишь зануление ссылки на объект в конкретном месте. Это ни в коем случае не удаляет ничего из памяти и не означает, что на него нет других ссылок и он доступен для сборщика мусора. В as3 вообще нет средств для удаления чего-либо из памяти вручную. Если на объект занулить все ссылки, то он становится доступным для сборщика мусора, но и это не означает, что он его сразу удалит. Удаления мусора - это довольно ресурсозатратная операция, поэтому он копит определенное количество, и только после превышения разрешенного объема, начинает процесс удаления. Во время удаления мусора может легко провисать FPS или приложения может даже вообще на какое-то время остановиться, поэтому лучше не избавляться от ненужных в данный момент объектов, а по возможности использовать пулы. Но событий это не касается. Для них достаточно отписаться от слушателя. Я бы посоветовал почитать как работают ссылки в C++, там работа с памятью описана гораздо подробнее, и что такое ссылки и адреса в памяти будет намного яснее Ну и, конечно же, по as3 |
|
|||||
Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
|
А мне вот все таки интересно, почему так? Чем это обосновано, что плохого в самостоятельном управлении памятью? |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
В том, что платформа со сбощиком мусора, который занимается тем, что освобождает память, когда объекты никем не используются. Вообще бессымысленно заморачиваться на "удалении" объекта события. Даже если слушателей миллиард, то объект события будет один (за исключение ручного редиспатчинга)
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Вряд ли у тебя получится это правильно делать. Если бы адресация и удаление из памяти были такими простыми задачами, никто бы не придумывал разных сборщиков мусора
|
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
romanlysenko
Переменные "a" "b" "c" лежат в памяти, каждый по своему адресу. Текстфилд тоже лежит по своему адресу. По тем адресам, где лежат переменные, хранится только адрес текстфилда и больше ничего. То есть переменные сами лежат по каким то адресам и хранят какие-то адреса. А по тому адресу где лежит текстфилд, вот там да - лежит настоящий текстфилд. Если мы напишем то по тому адресу где хранится переменная "а" удалится адрес текстфилда, теперь там будет храниться число "0". В переменных "b" и "c" все еще лежит адрес текстфилда. |
Часовой пояс GMT +4, время: 13:21. |
|
« Предыдущая тема | Следующая тема » |
|
|