2012-12-12 91 views
0
package 
{ 
    public class SomeClass 
    { 
     public var myBtn:Button ; 
     public function SomeClass() 
     { 
     myBtn.addEventListener(MouseEvent.CLICK, clickFunction) ; 
     } 

     function clickFunction(e:Event){ 

     } 

    } 

} 

主類有些疑惑:想清楚關於垃圾收集(AS3.0)

var someClass:SomeClass = new SomeClass(); // step 1 
addChild(someClass); // step 2 
removeChild(someClass); // step 3 
someClass = null // step 4 

在上面,我要徹底摧毀SomeClass的實例,因此在步驟4,它已經賦值爲null值。

Q1)步驟4(賦值爲null)正確的方式來銷燬實例嗎?使用刪除的對象關鍵字http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html

Q2)我提到。但我不認爲刪除關鍵字可以用於類實例?那麼如何在這種情況下使用它呢?

Q3)SomeClass中的myBtn eventListener會發生什麼情況。我應該在銷燬SomeClass的實例之前手動添加removeEventListener。還是會自動銷燬?

謝謝

回答

1

1 /是的。 (我假設someClass變量是一個實例變量)

2/delete不僅刪除變量的值,而且還刪除變量的定義。由於AS3中的課程總體上是密封的,因此它不起作用。即delete只能用於動態創建的成員。主要是「鍵」ObjectDictionary實例。但顯然,您可以使用delete刪除標記爲dynamic的任何類的成員定義。

3 /是的,請務必手動刪除事件偵聽器。在將處理程序註冊爲偵聽程序時,您可以創建弱引用的事件偵聽程序,但最好始終確保手動刪除事件偵聽程序,它更具可讀性,清晰性和故障安全性。

我傾向於在所有類中都有一個destroy方法,實例所有者在清除對某個實例的引用時可以調用它。這種銷燬方法將註銷所有事件監聽器,使實例成員無效並進行各種清理。

1

創建有後,不再給它的任何引用會得到垃圾收集SomeClass的實例。通過將變量設置爲null,它將刪除該引用,並且只要沒有更多引用,SomeClass實例就會被垃圾回收。

在上面的代碼中,您不需要刪除事件偵聽器。當SomeClass實例被收集時,它的所有成員變量將被收集(除非它們在其他地方被引用)。由於事件偵聽器已將添加到按鈕,因此在收集按鈕時將收集該事件偵聽器。然而

一些需要注意的,如果不是myBtn.addEventListener您用過stage.addEventListener,該階段將保留引用您的回調函數,你可以用一個內存泄漏而告終。始終刪除分配給對象的事件偵聽器,這些對象在您關心偵聽器之後仍將保留。

Creynder的建議是很好的:移除事件偵聽器的習慣問題。但是,只有當事件監聽器的調度程序要停留,但不希望回調留在內存中時才真正需要。