0
package
{
     public class SomeClass
     {
       public var myBtn:Button ; 
       public function SomeClass()
       { 
         myBtn.addEventListener( MouseEvent.CLICK, clickFunction) ;
       }

       function clickFunction(e:Event){

        }

    }

}

メインクラス:

 var someClass:SomeClass = new SomeClass(); // step 1 
 addChild(someClass); // step 2 
 removeChild(someClass); // step 3 
 someClass = null  // step 4 

上記では、someClassインスタンスを完全に破棄したいので、ステップ4でnull値が割り当てられています。

Q1)ステップ4(nullへの割り当て)はインスタンスを破棄する正しい方法ですか?

Q2)オブジェクトにdeleteキーワードを使用してhttp://gskinner.com/blog/archives/2006/06/as3_resource_ma.htmlを参照しました。しかし、deleteキーワードをクラスインスタンスに使用できるとは思いませんか?この場合の使用方法は?

Q3)SomeClassのmyBtneventListenerはどうなりますか。SomeClassのインスタンスを破棄する前に、removeEventListenerを手動で追加する必要があります。それとも自動的に破壊されますか?

ありがとう

4

2 に答える 2

1

1/はい。(someClass変数はインスタンス変数だと思います)

2 /deleteは、変数の値だけでなく、変数の定義も削除します。AS3のクラスは一般的に封印されているため、機能しません。つまりdelete、動的に作成されたメンバーでのみ使用する必要があります。Object主にまたはDictionaryインスタンスの「キー」 。dynamicただし、明らかに、 usingとしてマークされたクラスのメンバー定義を削除できますdelete

3 /はい、常にイベントリスナーを手動で削除してください。ハンドラーをリスナーとして登録するときに、弱く参照されるイベントリスナーを作成できますが、イベントリスナーが手動で削除されていることを常に確認することをお勧めします。これにより、読みやすく、明確で、フェイルセーフになります。

私はすべてのクラスにメソッドを持っている傾向があります。このdestroyメソッドは、特定のインスタンスへの参照をクリーンアップするときにインスタンスの所有者が呼び出すことができます。このdestroyメソッドは、すべてのイベントリスナーの登録を解除し、インスタンスメンバーを無効にし、あらゆる種類のクリーンアップを実行します。

于 2012-12-12T14:51:14.680 に答える
1

作成したSomeClassインスタンスは、それへの参照がなくなるとガベージコレクションされます。変数をnullに設定すると、その参照が削除され、SomeClassインスタンスは、それへの参照がない限り、ガベージコレクションされます。

上記のコードでは、イベントリスナーを削除する必要はありません。SomeClassインスタンスが収集されると、そのすべてのメンバー変数が収集されます(他の場所で参照されている場合を除く)。イベントリスナーがボタンに追加されているため、ボタンが収集されるときにイベントリスナーが収集されます。

ただし、注意すべき点がありmyBtn.addEventListenerます。を使用した代わりにstage.addEventListener、ステージがコールバック関数への参照を保持し、メモリリークが発生する可能性があります。リスナーを気にした後も存在するオブジェクトに割り当てられているイベントリスナーを常に削除します。

Creynderのアドバイスは良いです:習慣の問題としてイベントリスナーを削除します。ただし、本当に必要なのは、イベントリスナーのディスパッチャがぶらぶらしているが、コールバックをメモリに残したくない場合だけです。

于 2012-12-12T16:20:22.847 に答える