![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 126
|
Пришла в голову мысль добавить всем классам, имеющим детей, проверку added_to_stage с методом init() и removed_from_stage с методом cleanup() соответственно. Весь код из конструктора перенести в init, а в cleanup удалить всех детей и обнулить все ссылки. Больше ради очищения мусора при переходе между комнатами, чем для проверки добавления на сцену.
В принципе, у меня уже есть такие проверки в самых старших родителях (детях Main) - классах соответствующих уровней/комнат/экранов (типа Level, Menu и т.д.), соответственно, при переходе из "комнаты" в "комнату" все внуки этих самых "комнат" удаляются автоматически (остаётся только разобраться со слушателями, которых я, на всякий случай, стараюсь всегда удалять отдельно). Вопрос в следующем: имеет ли смысл для любого объекта, имеющего детей, ставить проверки добавления на и удаления со сцены, чтобы быть уверенным, что чистится вся иерархия? (Если смысла в этом нет, то подскажите, в каких случаях, кроме наличия ссылки на stage, нужны такие проверки?) |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 126
|
Не уверен, что понял вас правильно.
Вот как у меня сейчас: Main.as: public class Main extends Sprite { // CONSTRUCTOR public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } // INIT private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // загружаем все элементы, создаём комнаты и т.д. }; // ПЕРЕХОД из комнаты в комнату private function transition(e:MyEvent):void { _Rooms[_curIn].cleanup(); // чистим комнату, из которой ушли removeChildren(); // уничтожаем всех детей // создаём новую комнату }; }; // CONSTRUCTOR public function Plan() { // создание и удаление всего при добавлении и удалении со сцены addEventListener(Event.ADDED_TO_STAGE, init); }; //INIT private function init(e:Event): void { // тут всё создаём и т.д. } //CLEANUP (вызывается родителем) public function cleanup(): void{ // удаляем всех детей removeChildren(); // убираем слушателей (своих и детей, если были объявлены здесь) // обнуляем ссылки на объекты }; |
|
|||||
|
Если нужно, чтобы все удалялось обязательно, то можно и сделать. Если нужно заново использовать, то ни в коем случае. В общем, могу сказать так, все зависит от задачи, которую нужно выполнить.
Вот такой подход (говорю из практики), может привести к таким глюкам, что голова взорвется их потом лечить. У меня в одной игре был такой подход, и как-то раз получилось так, что объект удалялся из дисплей листа, а ссылка на него сохранялась. Потом происходило обращение к одному из его свойств, по событию с сервера, а так как свойство уже было обнулено внутри, происходило падение null refference. Честно скажу, перематерил всех и вся, пока искал в чем же проблема, и потратил на это несколько недель. Все усложнялось еще тем, что глюк происходил не всегда. В общем, для себя тогда решил, что такой подход больше не буду использовать никогда. Сейчас я делаю везде методы dispose(); в которых все подчищается, и происходит это когда нужно, а не при удалении объекта из дисплей листа |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 126
|
Цитата:
Спасибо всем за советы. |
|
|||||
|
Цитата:
Но чтобы можно было реиспользовать придется грамотно писать иниты с дестроями. Чтоб в любой момент можно было вместо new Some() взять из буфера и сделать some1.init(); Ну и соответственно чтоб дестрой дестроил по-максимуму, но ровно настолько, чтобы потом оставалась возможность реинита.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
[+1 25.10.13]
[+4 18.03.14] |
Автоматическое неявное удаление закономерно и неизбежно приведет к ошибкам.
|
|
|||||
|
Вообще Дикобраз правильную тему толкает: пул объектов спасает. Вместо
в конструкторе которого будет инициализация переменных делать который вернет экземпляр (возможно, новый, возможно, старый, но уже "ненужный"). dispose() делает только то, что возвращает объект в этот пул. А подчищается всё в пуле там, где это нужно.
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|