2009-02-25 127 views
1

我在Flash和as3中構建動畫,我有一個函數可以添加舞臺 eventListener,stage.addEventListener(Event.ENTER_FRAME,setScrollPercent,false,0,真正);flash AS3我如何刪除舞臺事件監聽器

由於這個事件是在一個函數的函數裏面設置的,所以「兩個函數很深」,我怎樣才能從函數外部重置所有的舞臺事件監聽器而不會出錯?

回答

5

最佳實踐與AS事件監聽器有:

  • 讓它弱(如你所做的,使用addEventListener的最後一個參數)
  • 將事件偵聽器後空處理(嚴格來說不需要,如果你把它設置爲弱)

Flex不會給你析構函數。它擁有自己的垃圾收集器,在後臺管理內存。一旦沒有對它的引用,它會清理一段內存。那麼,強烈的參考。所有對象默認都有很強的參考。事件處理程序,因爲它們往往是一個性能瓶頸,具有這種宣稱自己很弱的特殊能力 - 一個弱點的參考。這當然只有當您使用addEventHandler()函數附加事件處理程序時纔有可能。 GC沒有考慮到弱引用,因此,當所有強引用都消失時,它們將自動收集垃圾,從而使您免於手動執行=null的緊張局勢。當你不指定參數時,你會做什麼。默認情況下,即使處理程序被創建爲強引用。

但是,標記它們弱有副作用。沒有你知道它們,它們會消失在稀薄的空氣中。最終,你會知道,但是就一個討厭的bug而言。那是什麼導致你的問題?也許,可能不是。你必須嘗試。此外,如果您可以向我們提供更多詳細信息(如確切的錯誤代碼,某些來源),它將有所幫助。

希望這會有所幫助。快樂的彎曲:)

+0

你可以添加一個例子嗎?我是AS3的新手,我真的不知道弱點是什麼。 – 2009-02-25 14:34:24

1

你看到了什麼錯誤?嵌套級別不應該與它有任何關係,因爲監聽器只是通過參數進行註冊,所以只要您使用與用於添加的相同的三個關鍵參數調用remove,您應該沒問題。

你真正的問題是如何獲得對外部範圍的偵聽器對象的引用?如果是這樣,有幾種可能的解決方案,最好的方法取決於你的代碼結構。

- MarkusQ

0

你的問題的答案,我意識到你有一個範圍的問題,因爲我剛剛回答了一個問題,你的範圍,是你正在與舞臺。考慮全局舞臺,因爲它是繪製所有顯示對象的畫布。

以下將在任何地方工作!

stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true); 

現在,你在說什麼,即時猜測錯誤,就是你只設置上面removeEventListener當你已準備好,將無法正常工作。

removeEventListener函數不接受像它的同級addEventListener這樣的五個參數,它只允許三個忽略優先級和弱引用,如下所示。

//The following removes YOUR stage Event.ENTER_FRAME listener from any scope. 
stage.removeEventListener(Event.ENTER_FRAME, setScrollPercent, false); 

希望這會有所幫助,請記住這個階段是在一定意義上的全球根,小心根,它的實際工作就應該是怎樣,現在的事實,呼籲根現在是相對於SWF你從階段開始,而不是階段,除非階段是當前範圍的根。

0

你應該能夠使用你的舊功能,並使用removeEventListeners而不是添加。其實很簡單。