![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jan 2007
Сообщений: 302
|
В принципе, чтоб просто избавлятся, - все компоненты глобальными не сделаешь, это не выход, да и не красивый стиль программирования.
![]() |
|
|||||
|
Причем здесь глобальность объектов?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jan 2007
Сообщений: 302
|
Я имею введу то, что глобальные обЪекты видны во всех функциях, если же обЪект создан только в пределах функции, как моя функция которая делает всю зачистку и зануляет обЪекты достучится до этого обЪекта. Я это имел введу.
Последний раз редактировалось iNils; 02.02.2011 в 14:40. |
|
|||||
|
Какой смысл от компонентов, к которым нельзя достучаться?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jan 2007
Сообщений: 302
|
К примеру я делаю 10 кнопок или полей ввода и 10 надписей(что должна делать эта кнопка), пускай у меня эти 10 кнопок глобальные обЪекты, я ими буду пользоваться в разных функциях. Для надписей я делаю отдельную функцию, которая принимает string,xPos,yPos к примеру и там же создаю новый обЪект надписи припустим new TextField().
Следует только вызвать функцию для каждой кнопки или поля ввода и так д.. Или есть лучшее решение такой задачи? Добавлено через 8 минут iNils Понял, просто привычней с "ь" чем с "ъ" - она на клавиатуре в уголок забилась. ![]() ![]() да и вижу что ошибка, не думал что так серьезно отнесетесь к ошибке в читаемом даже с ошибкой слове. ![]() Последний раз редактировалось Killer_13; 02.02.2011 в 14:48. |
|
|||||
|
Давай разберемся что такое глобальные объекты.
Глобальный объект — это то, что доступно глобально. Глобально — значит является статичным полем класса. Это не твой случай. А ещё есть поле класса. Это уже скорее твой. Функций внутри класса не существует. Внутри класса существуют методы. Функции могут существовать внутри пакета, внутри метода, быть привязанными к полю класса. Чтобы по клику на кнопку происходил её хэндлер — её нужно подписать и вывести на экран. Подписка — дело тонкое и непонятное, черт его знает сохранится ли ссылка внутри EventDispatcher при подписке или нет для сбора GC. Однако используя нативный EventDispatcher тебе её не получить. Но с дисплай листом дело куда лучше: ссылку на то, что в дисплай листе всегда можно получить с помощью DisplayObjectContainer#getChildAt и отсюда никуда не деться. Значит, ссылка всё равно останется. Поэтому сохраняя ссылку ещё и в поле класса плохо не будет.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jan 2007
Сообщений: 302
|
Мы возможно друг друга чуток не поняли, а может я чуток не называю вещи своими именами. ![]() Сейчас приведу пример, что я имею введу, под теми выражениями, что я говорил. Возьмем какой то класс 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(,.... //как быть с этой переменной, циклом пробежаться и собрать все объекты с рабочей области можно, этого хватит? } } } |
|
|||||
|
Цитата:
__________________
...вселенская грусть |
|
|||||
|
Цитата:
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();
}
}
}
Моё мнение — что эти тонкости людям следует понять со временем. А на первое время отписываться от всего, на что вообще была произведена подписка, в случае вызова псевдодеструктора объекта, отмахиваясь на GC со словами "магия". Хотя нет, не так. Занулив объект, ссылающийся на другой объект данная ссылка перестаёт существовать, т.к. ссылки по своей природе однонаправленны (объект а может иметь ссылку на б, но б может не иметь ссылку на а). Касается это и EventDispatcher`а. Людям почему-то это сложно понять, поэтому я ратую за зануление всего подряд)
__________________
Тут мужик танцует и поёт про флэш Последний раз редактировалось Psycho Tiger; 02.02.2011 в 18:37. |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:21. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|