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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.03.2009, 15:23
2K WebStudio вне форума Посмотреть профиль Отправить личное сообщение для 2K WebStudio Посетить домашнюю страницу 2K WebStudio Найти все сообщения от 2K WebStudio
  № 11  
Ответить с цитированием
2K WebStudio
 
Аватар для 2K WebStudio

Регистрация: Jul 2002
Адрес: Russia Federation Moscow
Сообщений: 779
Отправить сообщение для 2K WebStudio с помощью ICQ
Цитата:
Сообщение от __etc Посмотреть сообщение
В правильно начатом проекте проблемы отписывания от событий в принципе не возникнет.
согласен. проблемы нет.
я просто хотел понять, есть ли необходимость удалять всех детей и слушателей, если я хочу удалить родителя.

Старый 10.03.2009, 15:25
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 12  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Удаление детей должен произвести сам удаляемый объект.

Старый 10.03.2009, 15:27
2K WebStudio вне форума Посмотреть профиль Отправить личное сообщение для 2K WebStudio Посетить домашнюю страницу 2K WebStudio Найти все сообщения от 2K WebStudio
  № 13  
Ответить с цитированием
2K WebStudio
 
Аватар для 2K WebStudio

Регистрация: Jul 2002
Адрес: Russia Federation Moscow
Сообщений: 779
Отправить сообщение для 2K WebStudio с помощью ICQ
Цитата:
Сообщение от __etc Посмотреть сообщение
Удаление детей должен произвести сам удаляемый объект.
как и удаление их слушателей.

Старый 10.03.2009, 15:38
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 14  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
в общем случае, я делаю метод destroy, который запускает destroy у всех детей, а потом зануляет свои ссылки и убивает слушателей. Уж свои-то листенеры объект должен знать.

Старый 10.03.2009, 15:46
2K WebStudio вне форума Посмотреть профиль Отправить личное сообщение для 2K WebStudio Посетить домашнюю страницу 2K WebStudio Найти все сообщения от 2K WebStudio
  № 15  
Ответить с цитированием
2K WebStudio
 
Аватар для 2K WebStudio

Регистрация: Jul 2002
Адрес: Russia Federation Moscow
Сообщений: 779
Отправить сообщение для 2K WebStudio с помощью ICQ
Цитата:
Сообщение от iflamberg Посмотреть сообщение
в общем случае, я делаю метод destroy, который запускает destroy у всех детей, а потом зануляет свои ссылки и убивает слушателей. Уж свои-то листенеры объект должен знать.
зануляет ссылки на себя? как он узнает о них?

Старый 10.03.2009, 16:17
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 16  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
зануляет ссылки внутри себя. Убить ссылку на него - задача уже его родителя.
Непонимаю в чем проблемы, любой программист, который учился программированию на cpp или даже pascal имеет понимание о том, как освободить память.

Старый 10.03.2009, 16:26
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 17  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Цитата:
Сообщение от 2K WebStudio Посмотреть сообщение
как и удаление их слушателей.
Если родитель слушает события детей, то он должен от детей отписаться.

Старый 10.03.2009, 16:57
2K WebStudio вне форума Посмотреть профиль Отправить личное сообщение для 2K WebStudio Посетить домашнюю страницу 2K WebStudio Найти все сообщения от 2K WebStudio
  № 18  
Ответить с цитированием
2K WebStudio
 
Аватар для 2K WebStudio

Регистрация: Jul 2002
Адрес: Russia Federation Moscow
Сообщений: 779
Отправить сообщение для 2K WebStudio с помощью ICQ
Цитата:
Сообщение от iflamberg Посмотреть сообщение
зануляет ссылки внутри себя. Убить ссылку на него - задача уже его родителя.
Непонимаю в чем проблемы, любой программист, который учился программированию на cpp или даже pascal имеет понимание о том, как освободить память.
изучаю специфику флеша. мало ли что.
меня просто удивила формулировка вашего ответа - потому и уточнил.

Цитата:
Сообщение от __etc Посмотреть сообщение
Если родитель слушает события детей, то он должен от детей отписаться.
естественно.

Старый 11.03.2009, 23:15
Румеев вне форума Посмотреть профиль Отправить личное сообщение для Румеев Найти все сообщения от Румеев
  № 19  
Ответить с цитированием
Румеев

Регистрация: 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.
Старый 12.03.2009, 02:51
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 20  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
Цитата:
Сообщение от iflamberg
флеш не настолько умный. Все ссылки лучше занулять(включая удаляемых детей).
Неверно. Флэш умный.

Цитата:
Сообщение от 2K WebStudio
есть ли необходимость удалять всех детей
Нет такой необходимости.

Цитата:
Сообщение от __etc
Удаление детей должен произвести сам удаляемый объект.
Разве? Я ни в одном примере не видел, чтобы в каждом классе писались деструкторы, удаляющие всех детей объекта, на который нигде не осталось ссылок. Если у объекта там что-то внутри друг на друга ссылается, оно все будет удалено пачкой.

Цитата:
Сообщение от iflamberg
в общем случае, я делаю метод destroy, который запускает destroy у всех детей, а потом зануляет свои ссылки
Смысл? Эта работа бесполезна Как уже сказали выше, такой подход может ускорить GC, и все.

Цитата:
Сообщение от iflamberg
Непонимаю в чем проблемы, любой программист, который учился программированию на cpp или даже pascal имеет понимание о том, как освободить память.
Так AS3 не паскаль или cpp. В AS3 есть сборщик мусора как бы.


В общем-то проверьте профайлером:

Код AS3:
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);
		}
	}
}
Код AS3:
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{
		}
	}
}
Все прекрасно удаляется из памяти и без ручного обнуления всего и вся. Утечек памяти нет. Версия плеера 10.12.36.

Насчет удаления слушателей надо понимать лишь, что такое слушатель, и как оно работает. А работает оно как-то так:
http://www.javaworld.com/javaworld/j...04-events.html
child.addEventListener(event, parentFunc) в массив _listeners ребенка кладет ссылку на parentFunc. А т. к. это дело изолировано в ребенке, то ничего казалось бы не помешает флэшу удалить спокойно child из памяти, если на него не осталось ссылок. Но из-за особенности флэшовских событий (bubbling) в родителе тоже возможно сохраняются ссылки на ребенка - мое предположение. Поэтому:
Цитата:
Сообщение от __etc
Если родитель слушает события детей, то он должен от детей отписаться.
Хотя ИМХО это банально перестраховка (см. пример для профайлера выше), ибо по-хорошему методы addChild и removeChild класса DisplayObject должны быть умными и удалять всех лишних слушателей из Event Flow автоматически. Может быть в прошлых версиях плеера был какой-то баг, связанный с удалением объектов? __etc, почему именно-то Вы везде рекомендуете удалять слушателей?

Кстати, может кто знает, нет ли где-нибудь статьи, в которой описана модель событий флэша на очень детальном уровне? Т. е. фактически как написать класс EventDispatcher идентичный флэшовому.


Последний раз редактировалось s8000_1; 12.03.2009 в 06:00.
Создать новую тему Ответ Часовой пояс GMT +4, время: 23:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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