2010-09-22 89 views
0

這是很長的 - 不知道是否有人會麻煩閱讀它(不知道我會不會),但一直在打我的頭反對這一天之內。無法刪除只有一系列對象中的第一個

我有一個問題,我創建的一系列對象中的第一個沒有被釋放。我從對象中刪除事件偵聽器,使用localconnection hack等,它可以立即釋放除第一個對象之外的任何對象。

這裏是背景:

我本來本申請這是由一個巨大的MX的主要MXML文件:純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類 - 它應該?)

+0

我看過了,但沒有提供幫助。你在應用程序中使用過Flex Profiler嗎?你怎麼知道第一個對象從不刪除?爲什麼這很重要? – JeffryHouser 2010-09-23 00:31:22

+0

每個對象都包含整個應用程序的所有數據 - 通常爲10-20兆字節。我無法訪問flex profiler。其他人也建議pblabs分析器,我也嘗試過但尚未運行。 – Mark 2010-09-23 01:01:14

+0

剛剛得到了pblabs探查器的工作 - 只適用於FP 10顯然 – Mark 2010-09-23 01:39:51

回答

1

但是,如果不延長任何現有的AS3或Flex類,你怎麼把它添加到舞臺?它應該擴展DisplayObject或它的後代。 initialize =「」除了添加一個Eventlistener之外沒有其他的含義。那麼你在初始化後刪除它嗎?如果沒有,你有第一個Rad_XF對象的引用,所以你不能刪除它。

+0

Rad_XF有像mx:Canvas和mx:Text這樣的成員,並且應用程序將這些成員添加爲子項。但是你的其他評論關於初始化只是添加一個新的eventlistener(這需要被刪除) - 我主要認爲你正在處理某些事情,但如前所述,我嘗試以各種其他方式初始化第一個Rad_XF,結果相同。無論如何,您認爲Rad_XF的成員函數是通過調用initialize =「{new Rad_XF(this);}」被添加爲事件監聽器的。感謝您的反饋。 – Mark 2010-09-23 13:13:18

+0

但是我會再次看看編譯器爲mxml生成的動作,只是爲了檢查它沒有做你的建議。 – Mark 2010-09-23 13:22:13

+0

但是,例如我相信我已經初始化了只是引用RadXF中的一個靜態函數,它除了啓動一個定時器,其中定時器處理程序實際上創建了第一個Rad_XF,並且具有相同的結果(無法刪除初始Rad_XF)。 – Mark 2010-09-23 13:42:38