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

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

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

Регистрация: Jan 2007
Сообщений: 302
В принципе, чтоб просто избавлятся, - все компоненты глобальными не сделаешь, это не выход, да и не красивый стиль программирования.

Старый 02.02.2011, 13:30
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 32  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Цитата:
Сообщение от Killer_13 Посмотреть сообщение
В принципе, чтоб просто избавлятся, - все компоненты глобальными не сделаешь, это не выход, да и не красивый стиль программирования.
Причем здесь глобальность объектов?

Старый 02.02.2011, 13:37
Killer_13 вне форума Посмотреть профиль Отправить личное сообщение для Killer_13 Найти все сообщения от Killer_13
  № 33  
Ответить с цитированием
Killer_13
 
Аватар для Killer_13

Регистрация: Jan 2007
Сообщений: 302
Я имею введу то, что глобальные обЪекты видны во всех функциях, если же обЪект создан только в пределах функции, как моя функция которая делает всю зачистку и зануляет обЪекты достучится до этого обЪекта. Я это имел введу.


Последний раз редактировалось iNils; 02.02.2011 в 14:40.
Старый 02.02.2011, 14:30
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 34  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Какой смысл от компонентов, к которым нельзя достучаться?

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

Регистрация: Jan 2007
Сообщений: 302
К примеру я делаю 10 кнопок или полей ввода и 10 надписей(что должна делать эта кнопка), пускай у меня эти 10 кнопок глобальные обЪекты, я ими буду пользоваться в разных функциях. Для надписей я делаю отдельную функцию, которая принимает string,xPos,yPos к примеру и там же создаю новый обЪект надписи припустим new TextField().
Следует только вызвать функцию для каждой кнопки или поля ввода и так д..
Или есть лучшее решение такой задачи?

Добавлено через 8 минут

iNils
Понял, просто привычней с "ь" чем с "ъ" - она на клавиатуре в уголок забилась. да и вижу что ошибка, не думал что так серьезно отнесетесь к ошибке в читаемом даже с ошибкой слове.


Последний раз редактировалось Killer_13; 02.02.2011 в 14:48.
Старый 02.02.2011, 15:01
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 36  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Давай разберемся что такое глобальные объекты.
Глобальный объект — это то, что доступно глобально. Глобально — значит является статичным полем класса. Это не твой случай.
А ещё есть поле класса. Это уже скорее твой.
Функций внутри класса не существует. Внутри класса существуют методы. Функции могут существовать внутри пакета, внутри метода, быть привязанными к полю класса.

Чтобы по клику на кнопку происходил её хэндлер — её нужно подписать и вывести на экран. Подписка — дело тонкое и непонятное, черт его знает сохранится ли ссылка внутри EventDispatcher при подписке или нет для сбора GC. Однако используя нативный EventDispatcher тебе её не получить.
Но с дисплай листом дело куда лучше: ссылку на то, что в дисплай листе всегда можно получить с помощью DisplayObjectContainer#getChildAt и отсюда никуда не деться. Значит, ссылка всё равно останется. Поэтому сохраняя ссылку ещё и в поле класса плохо не будет.

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

Регистрация: Jan 2007
Сообщений: 302
Мы возможно друг друга чуток не поняли, а может я чуток не называю вещи своими именами.
Сейчас приведу пример, что я имею введу, под теми выражениями, что я говорил.

Возьмем какой то класс

Код AS3:
package{
    public class A{
 
        //Я имел введу, что это глобальный объект для всех функций(методов) этого класса - (как сказано выше) "поле класса"
        //Возможно смутило то что я методы функциями назвал? :)
        private var cont:Sprite;
 
        public function A(){
 
             Aa();
 
        } 
 
        private function Aa():void{
            trace("Aa");
            this.cont =  = new Sprite();
            this.addChild(cont);
            //как быть с переменной text? Как было сказано выше, занулять ее не надо.
            var text:TextField = new TextField();
            this.cont.addChild(text);
            //а если ей еще слушателя добавить?
            text.addEventListener(,....
            //как быть с этой переменной, циклом пробежаться и собрать все объекты с рабочей области можно, этого хватит?
        }  
     }
}

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Подписка — дело тонкое и непонятное, черт его знает сохранится ли ссылка внутри EventDispatcher при подписке или нет для сбора GC
Все там просто. Когда мы подписываемся на событие, EventDispatcher запоминает нас и событие (вернее - нас, метод колбека и событие). Когда событие возникает, EventDispatcher пробегается по всем подписавшимся и вызывает в них нужные методы, передавая при этом объект Event
__________________
...вселенская грусть

Старый 02.02.2011, 18:31
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 39  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Все там просто. Когда мы подписываемся на событие, EventDispatcher запоминает нас и событие (вернее - нас, метод колбека и событие). Когда событие возникает, EventDispatcher пробегается по всем подписавшимся и вызывает в них нужные методы, передавая при этом объект Event
Это становится понятно при определенном опыте. Замечательный класс от silin`а — форсированный вызов GC, я позволю сюда скинуть реализацию примера:
Код:
package 
{
	import com.bit101.components.PushButton;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.events.*;
	import flash.text.TextField;
	import silin.utils.GarbageCollector;
	
	
	

	public class Main extends Sprite 
	{
		
		private var _obj:Sprite;
		private var _counter:int = 0;
		private var _tf:TextField = new TextField();
		
		private var _but1:PushButton;
		private var _but2:PushButton;
		private var _but3:PushButton;
	
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
			
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			stage.align = StageAlign.TOP_LEFT;
			
			_tf.border = true;
			_tf.selectable = false;
			_tf.x = 10;
			_tf.y = 10;
			addChild(_tf);
			_but1 = new PushButton(this, 120, 20, "_obj = null;", but1ClickHandler);
			_but2 = new PushButton(this, 120, 50, "force GC;", but2ClickHandler);
			_but3 = new PushButton(this, 120, 80, "reset", but3ClickHandler);
			_but1.setSize(100, 20);
			_but2.setSize(100, 20);
			
			initObj();
		}
		
		private function initObj():void
		{
			_obj = new Sprite();
			_obj.addEventListener(Event.ENTER_FRAME, testEnterFrameHandler);
		}
		
		private function testEnterFrameHandler(evnt:Event):void 
		{
			
			_tf.appendText("\n" + _counter++);
			_tf.scrollV = _tf.maxScrollV;
			
		}
		
		private function but1ClickHandler(evnt:MouseEvent):void 
		{
			_obj = null;
		}
		
		private function but2ClickHandler(evnt:MouseEvent):void 
		{
			GarbageCollector.force();
		}
		private function but3ClickHandler(evnt:MouseEvent):void 
		{
			_counter = 0;
			initObj();
		}
	}
	
}
Занулив ссылку на объект, но не отписавшись от его события ENTER_FRAME и вызвав GC мы съели этот объект. Хотя на первый взгляд кажется что это хрень: как же, ссылка ведь осталась внутри EventDispatcher`а! Однако этот самый EventDispatcher мы и занулили, то есть подписка осталась на объекте, который тоже зануллен.

Моё мнение — что эти тонкости людям следует понять со временем. А на первое время отписываться от всего, на что вообще была произведена подписка, в случае вызова псевдодеструктора объекта, отмахиваясь на GC со словами "магия".

Хотя нет, не так. Занулив объект, ссылающийся на другой объект данная ссылка перестаёт существовать, т.к. ссылки по своей природе однонаправленны (объект а может иметь ссылку на б, но б может не иметь ссылку на а). Касается это и EventDispatcher`а.
Людям почему-то это сложно понять, поэтому я ратую за зануление всего подряд)


Последний раз редактировалось Psycho Tiger; 02.02.2011 в 18:37.
Создать новую тему Ответ Часовой пояс GMT +4, время: 05:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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