Цитата:
Сообщение от 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`а.
Людям почему-то это сложно понять, поэтому я ратую за зануление всего подряд)