2010-11-22 10 views
0

私は可能な限り簡潔にしようとします。私は、配列内のオブジェクトの数を持っている、と私は、クロージャを使用してそれぞれにイベントリスナーを適用しています:イベント処理クロージャが機能しなくなる原因は何ですか?

//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); 

私はUIに無関係なアクションを実行するまでは、しばらくの間、完璧に動作します。非常に複雑なシステムなので、何が起こっているのかは分かりません。無関係のアクションが、ボタンやボタン自体を含むオブジェクトに直接影響を与えないことを確認できます(少なくとも、パブリックインターフェイス経由では何も変更されていません)。ボタンは依然として存在し、クリックイベントリスナは、クラスのインターフェイス上に実際の関数が個別に割り当てられているため、正しく動作します。

私の質問は次のとおりです。これらのクロージャーがMouseOverイベントの処理を停止する原因を知っている人は誰ですか?

このMouseOverの動作を達成する方法はいくつかありますが、今のところ動作しているものに切り替わりましたが、将来の参照のためにこの質問の答えを知りたいと思います。

答えて

1

私はポストの直後に起こりそうな犯人を見つけました。ガベージコレクションです。確認に数分かかりました。これは、まさにaddEventListenerインタフェースのuseWeakReferenceパラメータと同じものです。デフォルトはtrueです。 falseに設定すると、この方法で割り当てられたリスナーがガベージコレクションされなくなります。 正しいコードは次のようになります。falseに

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'のデフォルト値。あなたがGCの問題を抱えているように聞こえるかもしれませんが、明示的に「false」を渡さないことは明らかです。 –

+0

あなたのアプリの別の部分にある何かが 'button_glow_filter'への参照を上書きしてボタンが発光しなくなる可能性はありますか? – martineno

+0

私は閉鎖の問題があるかもしれないと思います。あなたの私生活ではなく、そこにある2つの匿名の機能を意味します。ガベージコレクションの問題を修正するための広範なブラシのアプローチでは、ローカル変数をメンバ変数に無差別に変更し、無名関数をメンバ関数に無差別に変更してみてください。 JuanはuseWeakReferenceをfalseにデフォルト設定していたのです。 –

関連する問題