Javascript 每个addEventListener是否需要removeEventListener来防止Appcelerator中的内存泄漏
如果我有一个简单的警报对话框,如Javascript 每个addEventListener是否需要removeEventListener来防止Appcelerator中的内存泄漏,javascript,ios,memory-leaks,titanium,appcelerator,Javascript,Ios,Memory Leaks,Titanium,Appcelerator,如果我有一个简单的警报对话框,如 var dialog = Ti.UI.createAlertDialog({ cancel: 1, buttonNames: ['OK'], message: 'Here is message.', title: 'Title' })
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”最终会在垃圾收集过程中释放吗?还是因为我从未调用dialog.removeEventListener,它将永远存在内存中?在您的示例中,您不需要删除事件侦听器 为了防止内存泄漏,在这种情况下,您需要做的唯一一件事就是确保声明
var dialog
,而不仅仅是dialog
(您做得很好)。当窗口关闭时,本地范围内的所有UI元素都将从内存中删除。如果声明全局引用,可能会导致内存问题
现在有一些情况下,您必须删除事件监听器,这些是自定义事件监听器。专门向
Ti.App
对象添加自定义事件而不删除它们会给您带来很多麻烦。我通常不建议添加任何函数,但如果您真的需要,您应该确保将其删除,同时确保事件处理程序是一个命名函数。说得好,我还要添加一件大家都需要注意的事情:查看函数名称:addEventListener,它不是setEventListener,多次调用addEventListener将导致事件侦听器的回调被多次调用,它不会覆盖以前添加的事件侦听器(我非常熟悉ECMAScript和DOM,但对Titanium来说是新手。)“麻烦”是什么(内存泄漏除外)如果在其他情况下不删除事件侦听器,您会想到这一点吗?为什么事件侦听器是一个命名函数(Tianium是否执行函数序列化?)很重要?除了内存泄漏之外,您可以在应用程序中看到一些奇怪的行为,例如多次触发事件,如果这些事件处理某些UI,则会阻塞UI线程。-命名函数专门用于全局自定义事件,您可以在受支持的事件上使用匿名函数,当不再使用或引用UI组件时,这些函数将被删除对addEventListener的多次调用不会为同一事件生成多个事件回调!此事件的任何以前的处理程序都将自动删除。@DavidSpitter这只是部分正确。在addEventListener()调用中使用相同参数添加的任何以前的处理程序都将被替换。任何具有不同参数的都将添加到链中,并将分别调用。对于使用未命名函数执行此操作,还有一个警告,因为它们被视为不同的函数。例如,请参见的“多个相同的事件侦听器”部分。