Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每个addEventListener是否需要removeEventListener来防止Appcelerator中的内存泄漏_Javascript_Ios_Memory Leaks_Titanium_Appcelerator - Fatal编程技术网

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()调用中使用相同参数添加的任何以前的处理程序都将被替换。任何具有不同参数的都将添加到链中,并将分别调用。对于使用未命名函数执行此操作,还有一个警告,因为它们被视为不同的函数。例如,请参见的“多个相同的事件侦听器”部分。