2016-11-01 7 views
1

as3メモリー管理についてご質問があります。私はクラスAS3メモリー管理

public class CustomizationScreen extends MovieClip { 
     private var a:Display; 
     public var b:Buttons; 
     public function CustomizationScreen() { 
      a = new Display(200,-20); 
      b = new Buttons(900,-100,"Next"); 
      addChild(a); 
      addChild(b); 
     } 
} 

を持っていると私は

public class Main extends MovieClip { 
    public var c:CustomizationScreen; 
    public function Main() { 
     c = new CustomizationScreen(200,-20); 
     c.b.addEventListener(Event,func); 
     addChild(c); 
    } 
    // func 
} 

メインクラスにそのクラスをインスタンス化した場合、Cのオブジェクトがガベージコレクトされるために例えば

はこれで十分だろうか?

c.removeEventListener(Event,func); 
removeChild(c); 
c=null; 

また、cからaとbのオブジェクトも削除する必要がありますか?

答えて

1

あなたが知っておくべきこととして、ガベージコレクションは、オンタイム・プロセスではなく、メモリの貴重なマウントが割り当てられる刚性行うことがいけない...

The red line is our maximum allowed memory, then garbage called

が、あなたのオブジェクトのガベージ能力についての最も重要なことクラス内の他のオブジェクトとcomunicatesするハンドラをオブジェクトに残してはいけないということです。たとえば、イベントリスナーを正しく削除する必要があります。
はい:

はまた、この記事 https://code.tutsplus.com/tutorials/understanding-garbage-collection-in-as3--active-4412

そして、あなたの主な質問に答える中で見てみましょう。クラスはゴミ収集に成功します!

1

あなたは

public class Main extends MovieClip { 

     private var c:CustomizationScreen; 

     public function Main() { 
      c = new CustomizationScreen(200,-20); 
      c.b.addEventListener(Event,func); 
      addChild(c); 
     } 

    } 

機能に代わり、クラスでCを定義する必要がありますし、c.bではなく、CでのEventListenerを削除する必要があります。

public function dispose():void 
{ 
    c.b.removeEventListener(Event,func); 
    removeChild(c); 
    c=null; 
} 

他のクラスのaとbの参照がある場合は、CustomizationScreenでaとbをnullに設定する方がよいでしょう。

+0

これは簡単な例ですが、私はそれを編集することになります.c.removeEventListenerとcbremoveEventListenerは両方とも動作します。親クラスは子クラスのイベントを検索するためです。なぜaとbを設定する必要がありますか? nullはaとbを必要とするとき、あなたはそれの簡単な例を与えることができますか?ありがとうございました – creepez

関連する問題