> 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 > Flashcoders@chattyfig.figleaf.com > 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 Flashcoders@chattyfig.figleaf.com http://chattyfig.figleaf.com/mailman/listinfo/flashcoders