2010-11-22 5 views
0

Ich werde versuchen, so knapp wie möglich zu sein. Ich habe eine Reihe von Objekten in einem Array, und ich bin die Anwendung zu jedem Ereignis-Listener mit Schließungen:Was kann dazu führen, dass Event-Handling-Schließungen nicht mehr funktionieren?

//reduced to the logic in question: 
buttons.forEach(function(button:EventDispatcher, i:int, list:Array):void { 
    button.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event):void { 
    button.filters = [button_glow_filter]; 
    }); 
}); 
//button-specific click handlers: 
buttons[0].addEventListener(MouseEvent.MOUSE_CLICK, handle_some_action); 

Das funktioniert perfekt für eine Weile, bis ich eine unabhängige Aktion auf der Benutzeroberfläche durchführen. Es ist ein sehr komplexes System, daher bin ich mir nicht wirklich sicher, was passiert. Ich kann bestätigen, dass die nicht verwandte Aktion keine direkte Auswirkung auf das Objekt hat, das die Schaltflächen oder die Schaltflächen selbst enthält (zumindest ändert es nichts über die öffentlichen Schnittstellen). Die Schaltflächen sind weiterhin vorhanden, und die Klickereignis-Listener funktionieren weiterhin ordnungsgemäß, da ihnen auf der Klassenschnittstelle einzelne echte Funktionen zugewiesen sind.

Meine Frage ist daher: Weiß jemand, was dazu führen kann, dass diese Schließungen aufhören, die MouseOver-Ereignisse zu handhaben, ohne irgendeinen anderen wahrnehmbaren Effekt auf die verwandten Objekte zu haben?

Es gibt eine Reihe von Möglichkeiten, um dieses MouseOver-Verhalten zu erreichen, und für den Moment habe ich zu einem umgeschaltet, der funktioniert, aber ich würde immer noch gerne die Antwort auf diese Frage für zukünftige Referenz wissen.

Antwort

1

Ich habe den wahrscheinlichen Täter fast sofort nach der Veröffentlichung herausgefunden: Garbage Collection. Es dauerte nur ein paar Minuten, um zu bestätigen. Genau dafür steht der Parameter useWeakReference in der Schnittstelle addEventListener. Es ist standardmäßig wahr. Indem es auf "false" gesetzt wird, verhindert es, dass Listener, die auf diese Weise zugewiesen sind, unbemerkt gesammelt werden. Der richtige Code ist:

buttons.forEach(function(button:EventDispatcher, i:int, list:Array):void { 
    button.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event):void { 
    button.filters = [button_glow_filter]; 
    }, false, 0, false); 
}); 
+3

'useWeakReference' standardmäßig auf false. Klingt so, als ob du ein GC-Problem haben könntest, aber ich bezweifle, dass ich nicht "falsch" passiere, das ist der Schuldige. –

+0

Ist es möglich, dass etwas in einem anderen Teil Ihrer App den Verweis auf den 'button_glow_filter 'überschreibt, wodurch die Schaltflächen nicht mehr leuchten? – martineno

+0

Meine Vermutung ist, dass Sie möglicherweise Schließungsprobleme haben. Ich meine damit eher die zwei anonymen Funktionen als Ihr Privatleben. Für einen umfassenden Ansatz zur Behebung von Garbage-Collection-Problemen versuchen Sie wahllos lokale Variablen in Membervariablen und anonyme Funktionen in Memberfunktionen zu ändern. Juan hatte Recht, obwohl useWeakReference auf "false" gesetzt war. –

Verwandte Themen