Это довольно долго - не знаю, потрудится ли кто-нибудь прочесть это (не знаю, смогу ли я), но бьюсь головой об этом больше дня.
У меня проблема с тем, что первый из серии созданных мной объектов никогда не освобождается. Я удаляю прослушиватели событий из объекта, используя взлом локального соединения и т. Д., И он работает для немедленного освобождения любого объекта, кроме самого первого.
Вот фон:
Первоначально у меня было это приложение, которое представляло собой 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 - не так ли?)