0

これはボタンクリック時の私のコードです。myView をコンテナーに追加します。また、再度追加する前に以前のすべてのインスタンスが削除されることに注意してください。この「チェック」を行うためのより良い方法があるかどうか知りたいですか?特に、このコードの 1s 7 行 (コメント内) を削除する方法が必要です。通常のコード フローでは無関係なコード ブロックのように見えます。

function button_CLICK(e:Event)
{
///////////////////////////////////////////////////
            if ( myView!= null)
            {
                if ( contains(myView))
                {
                    removeChild(myView) ;
                }
            }
/////////////////////////////////////////////////////
            myView = new myView("hello")
            addChild(myView);

}
4

5 に答える 5

0

DisplayObjectContainerの(IMO)欠陥のある実装に基づくと、選択肢はあまりないと思います。アドビが適切な解決策であると考えた場合、単にエラーをスローするのではなく、スーパーメソッドを呼び出す前に、removeChildを「修正」して、子がそこにあるかどうかを確認できます。

上記のコードは引き続き実行されますが、removeChildオーバーライドに含まれます。

于 2012-05-28T02:03:08.503 に答える
0

オブジェクトが何で構成されているかによって異なりますmyView。たとえば、独自のイベントリスナーがある場合は、条件チェックを使用して、オブジェクトを破棄する前にオブジェクトをクリーンアップして、メモリリークが発生しないようにします。

function button_CLICK(e:Event):void
{
    if (myView && contains(myView))
    {
        //clean up myView

        removeChild(myView);
    }

    myView = new myView("hello");
    addChild(myView);
}

ただし、myViewがリーク可能な参照やイベントリスナーを含まない単純な表示オブジェクトの場合は、変数を再割り当てして前のオブジェクトを上書きすることができます。

addChild()追加された表示オブジェクトが他のすべての上に配置されることに注意してください。しかし、それが避けたいかどうかに関係なくaddChild(myView)、ボタンがクリックされるたびにではなく、デフォルトまたは空のビューを1回割り当てる方がよいと思います。

function button_CLICK(e:Event):void
{
    myView = new myView("hello");
}

new myView("hello")常に同じオブジェクトになるので、コードはデモンストレーション用だと思いますか?おそらくこのオブジェクトが以前の構成とは異なるインスタンスを作成するために日付またはタイマーに依存している場合を除きます。

于 2012-05-27T18:17:34.220 に答える
0

コメントされたコードのブロックは、への最初の呼び出しにのみ必要ですbutton_CLICK(このメソッドの名前を変更する必要があります:) buttonClick。最初の呼び出しの後、このコードのブロックは不要です。このコードを削除するmyViewには、ではなくnull、のインスタンスをMyView表示リストに追加する必要があります。

var myView : MyView;

function init(){
   myView = new MyView("FAKE");
   myView.visible = false;
   addChild(myView);
   addEventListener("click",click);
}

function click(e:MouseEvent):void{
   removeChild(myView);
   myView = new Child("REAL");
   addChild(myView);
}
于 2012-05-28T07:55:58.957 に答える
0

試す:

if(myView != null)
    myView.parent && myView.parent.removeChild(myView);
于 2012-05-28T08:07:52.327 に答える
0

新しいインスタンスを作成する前に以前の myView を null にしないため、チェック コードによってメモリ リークが発生する可能性があります。注意。クラスの名前を大文字で始めることをお勧めします。

あなたのコードは、myView が追加されたときに button_CLICK メソッドを呼び出すこともできるようです。ビューが追加されたときにボタンを非表示にすることを検討してください。

インスタンス化された MyView クラスのインスタンスを 1 つだけ持つことができます。次に、毎回 null を作成して新しいインスタンスを作成するのではなく、同じインスタンスを追加して、初期化パラメーターを受け入れる init 関数を追加するだけです。例えば

var myView = new MyView();

function button_CLICK(e:Event)
{
if ( contains(myView))
{
removeChild(myView) ;
}
}
myView.init("hello");
addChild(myView);

}
于 2012-05-27T10:18:30.973 に答える