我想弄清楚使用匿名事件偵聽器的最佳選擇,使用後100%垃圾收集。我得到了這兩個例子,但我想知道如果它實際上使它們之間有什麼區別?匿名事件偵聽器有什麼更好的選擇?
var listener1:Function = function(e:Event):void
{
resource.removeEventListener(e.type, listener1);
loadedHandler(resource);
listener1 = null;
};
resource.addEventListener(ResourceEvent.LOADED, listener1);
或這一個...
resource.addEventListener(ResourceEvent.LOADED, function(e:Event):void
{
Resource(e.currentTarget).removeEventListener(e.type, arguments["callee"]);
loadedHandler(resource);
}, false, 0, true);
還是會有任何其他更好的解決方案?這對我來說非常重要,因爲這些偵聽器和函數可能會在應用程序中經常執行,所以這些偵聽器和函數會從內存中正確刪除。我可以去使用一個Dictionary來映射所有的監聽器等,然後在非匿名監聽器等中測試並刪除它們,但是這會很快涉及到,因爲可能會出現資源可以同時異步加載的情況在應用程序的不同類。
@dominic: 你的意思是將這樣的功能添加到方法中,對不對?正如我上面寫的應用程序加載資源異步,可能會發生,當前正在加載資源,而應用程序中其他地方的另一個類請求相同的資源。資源管理類(其中的代碼是)然後掛鉤到由資源調度的事件監聽器。據我瞭解,如果我在你的例子中使用類方法或函數作爲監聽器,它們將被新請求重新使用,並且舊請求的事件將永遠不會觸發。因此匿名函數存儲在一個變量中。我假設他們都留在內存中,直到他們各自的請求完成。 但也許我完全混淆了這一點,情況並非如此?我有時會發現事件很難掌握。
)感謝您的幫助!是的,它與您描述的類似,資源管理器處理加載(和卸載)的資源,但是沒有可預期的情況,所有的資源都被加載,如果任何類需要它們,RM會根據需要加載資源,如果不再需要它們,它們也可以被卸載(並且隨後再次被重新加載等)所以沒有必要說可以安全地說所有的資源都被加載了。 – BadmintonCat 2010-07-20 17:43:34
在這種情況下,您不應該刪除事件處理程序,否則您將無法迴應ResourceEvent.LOADED事件 – dotminic 2010-07-20 18:02:02
但問題是許多資源對象是在RM中創建的,因此不會重新使用即使他們不再需要它們,他們也將永遠擁有事件監聽器。 – BadmintonCat 2010-07-20 18:35:19