2017-01-31 22 views
1

如果我有一個窗口內的一個簡單的警告對話框如是否每個的addEventListener需要removeEventListener以防止內存泄漏在Appcelerator的

    var dialog = Ti.UI.createAlertDialog({ 
        cancel: 1, 
        buttonNames: ['OK'], 
        message: 'Here is message.', 
        title: 'Title' 
        }); 
        dialog.addEventListener('click', function(e){ 
        // do something 
        }); 
        dialog.show(); 
        dialog = null; 

。假設我關閉了該窗口,並且該窗口實例未分配任何變量。窗戶應該被垃圾收集。在垃圾回收過程中,'對話'最終會被釋放還是因爲我從來沒有調用過dialog.removeEventListener它會永遠存在內存中?

回答

5

在你的例子中你要做而不是需要刪除事件監聽器。

爲了防止內存泄漏,在這種情況下你唯一需要做的就是確保你聲明var dialog而不是dialog(你做得很好)。窗口內局部範圍內的所有UI元素將在窗口關閉時從內存中移除。如果您聲明全局引用,則可能會導致內存問題。

現在有些情況下,您可以刪除事件偵聽器,並且這些是自定義事件偵聽器。將自定義事件專門添加到Ti.App對象而不刪除它們會導致很多麻煩。我通常不建議添加任何內容,但如果你真的需要它,你應該確保它被刪除,並確保事件處理程序是一個命名函數。

+0

不好意思,我想補充一件大家需要注意的事情: 看看函數名:addEventListener,它不是一個setEventListener,多次調用addEventListener會導致事件的回調監聽器被多次調用,它不會覆蓋之前添加的事件監聽器 – TheFuquan

+0

(我非常熟悉ECMAScript和DOM,但是對於Titanium來說是新的。)什麼是「很多麻煩」(內存泄漏放在一邊)期望如果在其他情況下不刪除事件_listener_?爲什麼重要的是事件監聽器是* named *函數(Titanium是否執行函數序列化?)? – PointedEars

+0

除了內存泄漏之外,您可以在您的應用中看到奇怪的行爲,例如觸發多次的事件,如果這些事件處理某些UI,則可能會阻塞UI線程。 - 指定的函數專門用於全局自定義事件,您可以在支持的事件上擁有匿名函數,並且在不再使用或引用UI組件時它們將被移除 –

相關問題