2009-06-24 3 views
2

Я создал объект, называемый loginInterface в flex builder. Когда этот объект инициализируется, он загружает интерфейс входа в систему, создает кнопки, поля ввода и так далее.Выгрузка объектов для сборщика мусора в AS3

Я создал метод для этого объекта, называемый выгрузкой. У меня также есть метод, который возвращает, был ли еще загружен интерфейс. Теперь я хочу выгрузить объект, чтобы экран не только имел место для нового интерфейса, но и объекты также должны быть удалены, чтобы эта память могла быть перераспределена.

Класс файл 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"); 
     } 
    } 
} 

Пожалуйста, смотрите функцию инициализации, где объекты загружаются и функцию разгрузки, где они должны быть выгружен. Это, визуально, работает. Однако, это лучший способ сделать это - и может ли даже сделать эти объекты выгружать из памяти сборщик мусора через некоторое время?

ответ

2

Когда вы удаляете объект (например, LoginInterface) из displayList его родителя, все дочерние элементы внутри этого объекта также будут автоматически удалены из памяти, если нет других объектов, содержащих ссылки на дети.

Таким образом, на самом деле вам не нужно удалять каждый из объектов, которые вы добавляете в DisplayList LoginInterface. Вам просто нужно удалить прослушиватели событий, которые вы назначили.

Таким образом, нет ничего плохого в том, что у вас происходит, но все, что вам действительно нужно в методе unload является:

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

Надежда, что помогает.

+0

Объект LoginInterface добавлен в список отображения его родителя. Однако мне нужно разгрузить интерфейс в другом дочернем элементе logininterface. Я не думаю, что это возможно? Так что мне нужно сделать это так, как я это делаю сейчас, или нет? – Tom

+0

@rhtx. Удаление слушателей в этом случае - хорошая идея (и хорошая практика в целом), но это не является абсолютно необходимым для того, чтобы сделать LoginInterface приемлемым для GC. –

1

Код выгрузки будет работать так, как вы этого хотите. Сборщик мусора Flash использует подсчет ссылок, чтобы определить, является ли конкретный объект кандидатом для сбора мусора. После запуска вашей функции unload() все объекты CustomButton, созданные вами в load(), будут иметь счетчик ссылок 0 и в конечном итоге будут собраны мусор.

Смежные вопросы