2009-06-24 10 views
2

私はflexInterfaceというオブジェクトをフレックスビルダーで作成しました。このオブジェクトが初期化されると、ログインインターフェイスがロードされ、ボタン、入力ボックスなどが作成されます。AS3のガベージコレクタのオブジェクトをアンロード

このオブジェクトのメソッドunloadを作成しました。私はまた、インターフェイスがまだロードされているかどうかを返すメソッドを持っています。今、オブジェクトをアンロードして、画面に新しいインターフェースのためのスペースがあるだけでなく、オブジェクトを実際に削除してそのメモリーを再割り当てできるようにしたい。

loginInterface.asクラスファイル:

package 
{ 
    //import required libraries 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
    import flash.net.URLRequest; 
    import flash.net.navigateToURL; 

    public class LoginInterface extends Sprite 
    { 
     private var welcomeLabel:CustomLabel; 
     private var versionLabel:CustomLabel; 
     private var loginButton:CustomButton; 
     private var registerButton:CustomButton; 
     private var usernameLabel:CustomLabel; 
     private var passwordLabel:CustomLabel; 
     private var usernameInputBox:CustomInputBox; 
     private var passwordInputBox:CustomInputBox; 
     private var loaded:Boolean = false; 

     public function LoginInterface() 
     { 
      trace("LoginInterface object loaded."); 
      init(); //initialize the login interface 
     } 

     public function init():void //initialize the login interface 
     { 
      trace("LoginInterface init method was called."); 

      //create objects 
      welcomeLabel = new CustomLabel(200, 100, 500, 30, "Welcome to the ALPHA client."); //welcome label 
      versionLabel = new CustomLabel(200, 120, 500, 30, "Version: v1.0.000", "Arial", 0x000000, 12); //version label 
      loginButton = new CustomButton(300, 300, 100, 30, "Login"); //login button 
      registerButton = new CustomButton(400, 300, 100, 30, "Register") //register button   
      usernameLabel = new CustomLabel(200, 200, 200, 30, "username: "); //username label  
      passwordLabel = new CustomLabel(200, 240, 200, 30, "password: "); //password label 
      usernameInputBox = new CustomInputBox(300, 200, 200, 30, false, 0x6D7B8D); //username input box 
      passwordInputBox = new CustomInputBox(300, 240, 200, 30, true, 0x6D7B8D); //password input box 

      //add objects to the display tree 
      addChild(welcomeLabel); 
      addChild(versionLabel); 
      addChild(loginButton); 
      addChild(registerButton); 
      addChild(usernameInputBox); 
      addChild(usernameLabel); 
      addChild(passwordInputBox); 
      addChild(passwordLabel); 

      //register object events 
      registerButton.addEventListener(MouseEvent.CLICK, registerClicked); //register button is clicked 
      loginButton.addEventListener(MouseEvent.CLICK, loginClicked); //login button is clicked 

      //interface has been loaded 
      loaded = true; 
     } 

     public function isLoaded():Boolean 
     { 
      if (loaded) return true; 
      return false; 
     } 

     public function unload():void 
     { 
      if (!loaded) return; 
      //welcomeLabel 
      removeChild(welcomeLabel); 
      welcomeLabel = null; 
      //versionLabel 
      removeChild(versionLabel); 
      versionLabel = null; 
      //loginButton 
      loginButton.removeEventListener(MouseEvent.CLICK, loginClicked); 
      removeChild(loginButton); 
      loginButton = null; 
      //registerButton 
      registerButton.removeEventListener(MouseEvent.CLICK, registerClicked); 
      removeChild(registerButton); 
      registerButton = null; 
      //usernameInputBox 
      removeChild(usernameInputBox); 
      usernameInputBox = null; 
      //usernameLabel 
      removeChild(usernameLabel); 
      usernameLabel = null; 
      //passwordInputBox 
      removeChild(passwordInputBox); 
      passwordInputBox = null; 
      //passwordLabel 
      removeChild(passwordLabel); 
      passwordLabel = null; 
      //set loaded to false 
      loaded = false; 
     } 

     private function loginClicked(event:MouseEvent):void 
     { 
      trace("Login button has been clicked."); 
      var username:String = usernameInputBox.text; 
      var password:String = passwordInputBox.text; 
      if (!checkLogin(username, password)) { 
       new Alert("Please enter a correct username and password."); 
      } 
      else { 
       trace("Creating socket connection."); 
       var socketConnection:SocketConnection = new SocketConnection(this); 
      } 
     } 

     private function checkLogin(username:String, password:String):Boolean 
     { 
      if ((username == "") || (password == "")) { 
       return false; 
      } 
      return true; 
     } 

     private function registerClicked(event:MouseEvent):void 
     { 
      trace("Register button has been clicked."); 
      var url:URLRequest = new URLRequest("http://url.com/client/register.php"); 
      navigateToURL(url, "_blank"); 
     } 
    } 
} 

オブジェクトがロードされているinit関数と、彼らはアンロードする必要がありますアンロード機能を参照してください。これは視覚的に機能します。しかし、これを実行する最善の方法ですか?そして、しばらくすると、これらのオブジェクトをガベージコレクタによってメモリからアンロードすることさえできますか?

答えて

2

親オブジェクトのdisplayListからオブジェクト(LoginInterfaceなど)を削除すると、そのオブジェクト内のすべての子オブジェクトも、そのオブジェクトへの参照を含む他のオブジェクトがない限り、自動的にメモリからも削除されます。子供。

したがって、LoginInterfaceのdisplayListに追加する各オブジェクトを実際に削除する必要はありません。割り当てたイベントリスナーを削除するだけで済みます。

だから、あなたが行くの持っているものは何も問題はありませんが、あなたが本当にあなたのunload方法で必要なのは、次のとおりです。助け

loginButton.removeEventListener(MouseEvent.CLICK, loginClicked); 
registerButton.removeEventListener(MouseEvent.CLICK, registerClicked); 

希望。

+0

LoginInterfaceオブジェクトは、その親のdisplayListに追加されています。しかし、logininterfaceオブジェクトの別の子でインタフェースをアンロードする必要があります。私はそれが可能だとは思わない?だから私は今やっているやり方と同じようにする必要がありますか? – Tom

+0

@rhtx。この場合のリスナーの削除は良いアイデアです(一般的には良い方法です)。しかし、LoginInterfaceをGCに適するようにすることは厳密には必要ではありません。 –

1

コードをアンロードすると、意図したとおりに動作します。フラッシュガベージコレクタは、特定のオブジェクトがガベージコレクションの候補かどうかを判断するために参照カウントを使用します。 unload()関数を実行すると、load()で作成したすべてのCustomButtonオブジェクトの参照カウントは0になり、最終的にガベージコレクションされます。

関連する問題