> There is no such thing as "a reference to be created invisibly within the
> event system".
I disagree. Try this test code:
package {
import flash.events.Event;
import flash.display.Sprite;
import flash.utils.getTimer;
public class TestClass extends Sprite {
public function TestClass() {
trace("Started!");
var s:Sprite = new Sprite();
s.addEventListener(Event.ENTER_FRAME, listener);
addEventListener(Event.ENTER_FRAME, listener);
}
private function listener(event:Event):void {
trace(event.currentTarget.toString() + getTimer());
}
}
}
You'll see both event handlers fire until the end of time. Event
references actually are kept, invisibly, within the event system.
On 3/13/08, EECOLOR <[EMAIL PROTECTED]> wrote:
> >If you add a normal event listener to a child,
> >and then remove that child, the child is _not_ garbage collected.
> >Objects are only garbage collected when all references to the object
> >are removed. Adding a normal event listener causes a reference to be
> >created invisibly within the event system.
>
>
>
> I think this is where we disagree. If a parent adds a listener to a child,
> this means the child has a reference to the parent, not the other way
> around. What you call the event system can be thought of as an array
> with handler methods on the child instance. This means that if you add
> a normal event listener to a child and then remove it, it will be
> garbage collected. There is no such thing as "a
>
> reference to be created invisibly within the event system".
>
>
> >You can't use weak references on an anonymous event listener.
>
>
> In my last email I agreed with you on this :)
>
>
> >You must remove all normal listeners from an object before it will be
> >garbage collected.
>
>
> Again, I do not think this is correct. An object will be garbage collected
> if there are no references to it. Adding listeners to an object will not
> create references to the object itself.
>
>
> An example (not usefull, but to illustrate the point):
>
> package
> {
> class TestClass
> {
> public function TestClass()
> {
> var o:EventDispatcher = new EventDispatcher();
> o.addEventListener(Event.COMPLETE, _handler);
> }; // At this point o will be marked for
> garbage collection, no references to o left.
>
> private function _handler(e:Event):void
> {
> };
> };
> };
>
>
> Another example (again not usefull, but to illustrate the point):
>
> package
> {
> class TestHandler
> {
> public function TestHandler()
> {
> };
>
> public function handler(e:Event):void
> {
> };
> };
> };
>
> package
> {
> import flash.display.Sprite;
>
> class TestClass extends Sprite
> {
> public function TestClass()
> {
> var o:TestHandler = new TestHandler();
> stage.addEventListener(Event.RESIZE, o.handler);
>
> }; // At this point o will not be marked for garbage collection, stage
> will still have a reference to it.
> };
> };
>
>
> I hope you agree on this. If not I am open to convincing arguments :)
>
>
>
> Greetz Erik
>
>
>
> On 3/13/08, Cory Petosky <[EMAIL PROTECTED]> wrote:
> >
> > > The common use for weak event
> > > listeners is when adding listeners to the stage
> >
> >
> > I disagree. Weak event listeners should be used in nearly all cases.
> >
> >
> > > In most cases there is actually no real benefit of creating weak event
> > > listeners. In most cases parents add
> > > listeners to their children. Children are removed and that's that.
> >
> >
> > This is not correct. If you add a normal event listener to a child,
> > and then remove that child, the child is _not_ garbage collected.
> > Objects are only garbage collected when all references to the object
> > are removed. Adding a normal event listener causes a reference to be
> > created invisibly within the event system.
> >
> > You must remove all normal listeners from an object before it will be
> > garbage collected.
> >
> >
> > > Hmmm, if it was garbage collected, why would I remove the listener, isnt
> > > that the point of weak references?
> >
> >
> > You can't use weak references on an anonymous event listener. The only
> > reference to that function is in the event system itself, so if you
> > use a weak reference, the garbage collector considers the anonymous
> > function eligible for garbage collection. Thus, the garbage collector
> > removes your event listener immediately, and you never get your event.
> >
> > (When I say "immediately," I really mean "at a random time when the GC
> > is invoked." Sometimes that's immediate, sometimes its not, but you
> > should assume immediacy so your code doesn't randomly break.)
> >
> >
>
> _______________________________________________
> Flashcoders mailing list
> [email protected]
> http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
>
--
Cory Petosky : Lead Developer : PUNY
1618 Central Ave NE Suite 130
Minneapolis, MN 55413
Office: 612.216.3924
Mobile: 240.422.9652
Fax: 612.605.9216
http://www.punyentertainment.com
_______________________________________________
Flashcoders mailing list
[email protected]
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders