|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Цитата:
я просто хотел понять, есть ли необходимость удалять всех детей и слушателей, если я хочу удалить родителя. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Удаление детей должен произвести сам удаляемый объект.
|
|
|||||
как и удаление их слушателей.
|
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
в общем случае, я делаю метод destroy, который запускает destroy у всех детей, а потом зануляет свои ссылки и убивает слушателей. Уж свои-то листенеры объект должен знать.
|
|
|||||
зануляет ссылки на себя? как он узнает о них?
|
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
зануляет ссылки внутри себя. Убить ссылку на него - задача уже его родителя.
Непонимаю в чем проблемы, любой программист, который учился программированию на cpp или даже pascal имеет понимание о том, как освободить память. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Если родитель слушает события детей, то он должен от детей отписаться.
|
|
|||||
Цитата:
меня просто удивила формулировка вашего ответа - потому и уточнил. естественно. |
|
|||||
Регистрация: Sep 2008
Сообщений: 6
|
Присоединяюсь к __etc.
Но сделаю замечание: занулять все ссылки, удалять всех детей и делать кучу других лишних действий (в общем случае) - это гемор чистой воды. Нужно занулять (и снимать слушатели) только то, что действительно необходимо Деструкторы в классах тогда будут занимать больше чем сами классы )) Зануления и удаления могут немного ускорить процесс "mark" у GC (garbage collector), не более. Важно четко и правильно понимать как флэш работает с памятью. Тогда проблем с "нужно/не нужно" не будет. P.S. Какие бы профи не были в команде разрабов, без Flex Profiler порой не обойтись P.P.P.P.P.S. ну и те кто пишут свои проги в Flash IDE, не прогеры... )))) гы Последний раз редактировалось Румеев; 11.03.2009 в 23:18. |
|
|||||||
Регистрация: Jun 2007
Сообщений: 374
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
В общем-то проверьте профайлером: package{ import flash.display.*; import flash.events.*; public class Test extends Sprite{ var mcs:Array; function Test(){ graphics.beginFill(0xFF00FF); graphics.drawRect(0,0,50, 50); mcs = new Array(); var mc:Sprite; for (var i:uint = 0; i< 100; i++){ mc = new Sprite(); mc.addEventListener(MouseEvent.CLICK, onChildClick); mcs.push(mc); } } private function onChildClick(e:Event):void{ trace (e.currentTarget); } } } package { import flash.display.*; import flash.events.*; public class MemoryTest extends Sprite { var bt:Sprite; var bt1:Sprite; var mc:Sprite; function MemoryTest() { bt = new Sprite(); bt.graphics.beginFill(0); bt.graphics.drawRect(0,0,100,100); stage.addChild(bt); bt1 = new Sprite(); bt1.graphics.beginFill(0xFF0000); bt1.graphics.drawRect(0,0, 100,100); bt1.x = 100; stage.addChild(bt1); bt.addEventListener(MouseEvent.CLICK, createObjects); bt1.addEventListener(MouseEvent.CLICK, removeObjects); } function createObjects(e:Event):void { if (mc) { return; } mc = new Test(); mc.addEventListener(MouseEvent.CLICK, clickListener); mc.y = 100; stage.addChild(mc); } function removeObjects(e:Event):void { if (!mc) { return; } stage.removeChild(mc); mc = null; } function clickListener(e:Event):void{ } } } Насчет удаления слушателей надо понимать лишь, что такое слушатель, и как оно работает. А работает оно как-то так: http://www.javaworld.com/javaworld/j...04-events.html child.addEventListener(event, parentFunc) в массив _listeners ребенка кладет ссылку на parentFunc. А т. к. это дело изолировано в ребенке, то ничего казалось бы не помешает флэшу удалить спокойно child из памяти, если на него не осталось ссылок. Но из-за особенности флэшовских событий (bubbling) в родителе тоже возможно сохраняются ссылки на ребенка - мое предположение. Поэтому: Цитата:
Кстати, может кто знает, нет ли где-нибудь статьи, в которой описана модель событий флэша на очень детальном уровне? Т. е. фактически как написать класс EventDispatcher идентичный флэшовому. Последний раз редактировалось s8000_1; 12.03.2009 в 06:00. |
Часовой пояс GMT +4, время: 23:26. |
|
« Предыдущая тема | Следующая тема » |
|
|