2009-05-12 11 views
2

アイテムを選択して上下に移動できるように、Flashで構築したメニューシステムがあります。オブジェクトがメニューから削除された場合は、選択した項目をnullに設定して、それ以上移動しようとはしません。Flash AS3 - nullに設定されていないオブジェクト

Iは、(現在のムービークリップのタイムラインのための)グローバル変数を有する:格納メニュー項目が(メニュー項目は、単にムービークリップである)を選択し、その項目が削除された場合、Iが設定されているもの

var selectedPlaylistItem:MovieClip; 

をnullに選択した項目:トレースは問題なくヌル表示されますが、私はnullに設定した後、アップアイテムを移動させ、私の次の関数では、それはまだそれがあったことをオブジェクトに設定されていることを

function removeFromPlaylist(sender:playlist_content_item) { 
    if(sender == selectedPlaylistItem) { 
     //Not sure why this isn't working, but at some point I need to figure it out. 
     selectedPlaylistItem = null; 
     trace(selectedPlaylistItem); 

削除される前に:

function playlistUp(sender:MovieClip) { 
    trace(selectedPlaylistItem); 

このトレースには元のオブジェクトが表示されます。

誰もがそれがうまくいかない理由を知っていますか?なぜそれが設定された後にそれがnullのままにならないのですか?

おかげ


UPDATE:

は、だから私は、私が起こっているのかを把握できたかどうかを確認するために、これを試してみました:

this.selectedPlaylistItem = null; 
    trace(selectedPlaylistItem); 
    setTimeout(function() {trace(selectedPlaylistItem);}, 4000); 

しかしトレースは、4秒後に発生したときに、それ直後のトレースではnullと表示されていても、選択されたオブジェクトだと言います。コード内のどこでも見たことがありますが、リセットされる場所はありません。

+0

実際の問題に気付かず、ヌルに設定している部分に多くのエネルギーを集中させていると思います。トレースしていない他のコードによってnullにリセットされている可能性があります。 – jsight

+0

スクリプト全体を投稿してください。それはあなたがそれを長く見てから見ただけの単純なものよりも多いでしょう。 – typeoneerror

答えて

1

私はそれがnullのままになるはずですから。あなたは他のコードのいくつかを投稿できますか?つまり、これらの2つの関数はどのコンテキストで呼び出されますか?

+0

ボタンのクリックから呼び出されています。それらは両方ともムービークリップの同じ場所にある関数なので、私は本当にそれがうまくいかない理由を失っています。 –

+0

私も迷っています。私が考えることができるのは、removeFromPlaylistのifに入っていない場合だけですが、トレースからnullが出力されたとします。あなたが誤ってselectedPlaylistItemという名前の2つの変数を持つスコープの問題かもしれませんが、それはありそうもありません。デバッガでそれをステップ実行してみてください(Ctrl + Shift + Enter + Flash CS3/CS4) – Cameron

+0

ええ、私は間違いなくnullに設定する場所を打っています。私はデバッガガを踏んだ。トレースと同じだった。変数はどこに宣言されていない(私は見て、私はそれがとにかくエラーをスローすると思います)ので、スコープの問題ではありません。 –

1

このコードはどこで「ライブ」ですか?タイムライン上にある場合は、selectedPlaylistItemを設定しているコードを再度呼び出すことができます。いずれの場合も、selectedPlaylistItemを予期せず呼び出すかどうかを確認するためにトレースまたはブレークポイントを設定します。

-2

は、すべてのイベントリスナーをオブジェクトから削除されたおよび/またはあなたがWeak Referencesを使用しています?

弱参照はガベージコレクタ(すなわちによってカウントされていないものです、それが参照してカウントされません。カウントし、マークスイープには従わない)。これは、オブジェクトに残っている唯一の参照が弱い場合、次のGC掃引で収集できることを意味します。

イベントリスナーに関連付けられた参照は、開発者によって忘れられがちです。通常、リスナーは決してメモリから削除されません。これは弱参照のイベントリスナーがAS3でとても便利な理由です。リスナーの削除を忘れると、ガベージコレクタがオブジェクトを収集することが妨げられることはありません。

// params: eventName, listener, capturePhase, priority, useWeakReference 
someObj.addEventListener("eventName",myFunct,false,0,true); 
+0

これはどういう意味か分かりません。変数がガベージコレクションされていない理由を尋ねません。イベントリスナーは変数がnullに設定されないようにします。 – quoo

0

あなたのコードでは、2フレーム以上にわたりことが起こるのか?私の推測では、コードをもう一度実行しているということです。したがって、スクリプトの進行では、現在のフレームがまだレンダリングされていない間はNULLに設定されますが、フレーム1に戻ってループすると、その変数を再び設定するコードが呼び出されることがあります。 4秒後にそれが何かに設定されているのが分かります。

+0

1つのフレームだけのムービークリップです。私は回避策を見つけましたが、なぜこれがnullのままでいないのか分かりません。 –

0

removeFromPlaylist()を実行しているときにselectedPlaylistItemが表示されている場合は、ヌルにする前に表示リストからオブジェクトを削除してみてください。

関連する問題