невозможно удалить только самый первый из серии объектов - PullRequest
0 голосов
/ 23 сентября 2010

Это довольно долго - не знаю, потрудится ли кто-нибудь прочесть это (не знаю, смогу ли я), но бьюсь головой об этом больше дня.

У меня проблема с тем, что первый из серии созданных мной объектов никогда не освобождается. Я удаляю прослушиватели событий из объекта, используя взлом локального соединения и т. Д., И он работает для немедленного освобождения любого объекта, кроме самого первого.

Вот фон:

Первоначально у меня было это приложение, которое представляло собой mxml-файл, состоящий в основном из огромного блока mx: Script чистого ActionScript 3. Приложение было настроено с помощью xml-файла, имя которого было передано в него из html-файла при запуске ,

Внесенное мною изменение состояло в том, чтобы разрешить последующую загрузку нового XML-файла (и перенастроить приложение), когда пользователь щелкает гиперссылку на XML-файл. Чтобы облегчить это, я взял весь вышеупомянутый блок кода из файла mxml и поместил его в свой собственный класс, в файл .AS. Теперь основной файл mxml нелепо короток - все, что он делает, это создает экземпляр этого нового класса в объявлении приложения mxml:

initialize="{new Rad_XF(this);}"  

Этот новый объект Rad_XF содержит весь старый код, ранее найденный в файле mxml.

И теперь, если пользователь щелкает ссылку, указывающую на действительный XML-файл, существующий объект Rad_XF создает новый объект Rad_XF, а новый объект Rad_XF после его инициализации удаляет старый. И это работает для удаления любого предыдущего объекта Rad_XF - кроме самого первого (инициализированного, как указано выше).

Вот код в Rad_XF для создания нового объекта Rad_XF, если пользователь щелкает ссылку:

private function txt_linkHandler(e:TextEvent):void  { 
  if (getExt(e.text).toUpperCase() == "XML")
    new Rad_XF(parent_app,this,e.text);  
  else 
    navigateToURL(new URLRequest(e.text),"_self");
} 

И код в Rad_XF для уничтожения предыдущего объекта Rad_XF:

 if (rad_xf_prev) {

    parent_app.removeChild(rad_xf_prev.CanvasSB);   

    parent_app.removeEventListener("enterFrame",rad_xf_prev.app_enterframe);
    parent_app.removeEventListener("mouseFocusChange",rad_xf_prev.repeat_end);
    parent_app.removeEventListener("activate",rad_xf_prev.app_activate_handlr);
    parent_app.removeEventListener("deactivate",rad_xf_prev.app_activate_handlr);
    parent_app.removeEventListener("mouseMove",rad_xf_prev.mouse_handlr);
    parent_app.removeEventListener("click",rad_xf_prev.mouse_handlr);
    parent_app.removeEventListener("doubleClick",rad_xf_prev.mouse_handlr);

    rad_xf_prev = null;

    try { 
       new LocalConnection().connect('foo'); 
       new LocalConnection().connect('foo'); 
    } catch (e:*) {} 

  }

Нет никакой разницы, как намеченной, так и на данный момент заметной, между этим первым объектом и всеми последующими объектами, и, тем не менее, первый объект не будет удален, хотя последующие будут. (Я включил вышеуказанный блок в вызовы System.TotalMemory, чтобы подтвердить это.) Первый объект инициализирован в файле mxml, но я попытался переместить его в файл AS - без разницы.

Вот первые несколько строк конструктора Rad_XF:

public function Rad_XF(parent_app:Application, rad_xf_prev:Rad_XF=null, fnCFG:String = null):void {

  this.parent_app = parent_app;             
  this.rad_xf_prev = rad_xf_prev;

parent_app - это приложение mxml. rad_xf_prev - предыдущий объект rad_xf, который в итоге удаляется.

Просто не знал, потрудится ли кто-нибудь прочитать это и предложить какие-нибудь жизнеспособные идеи. Или подумал, может быть, процесс написания этого может дать мне дополнительные идеи, но это не так.

(Примечание: Rad_XF не расширяет ни один существующий ActionScript или класс flex - не так ли?)

1 Ответ

1 голос
/ 23 сентября 2010

Но если он не расширяет какой-либо существующий класс as3 или flex, как вы можете добавить его на сцену? Он должен расширять DisplayObject или его потомков. Initialize = "" означает не что иное, как добавление Eventlistener. Так вы удаляете его после инициализации? Если нет, у вас есть ссылка на ваш самый первый объект Rad_XF, и вы не можете его удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...