每个addEventListener是否都需要removeEventListener来防止Appcelerator中的内存泄漏

for*_*umb 2 javascript memory-leaks titanium appcelerator ios

如果我有一个简单的警告对话框,如

                  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;
Run Code Online (Sandbox Code Playgroud)

在一个窗口内.假设我关闭了该窗口,并且该窗口实例未分配任何变量.窗口应该是垃圾收集."垃圾对话"最终会在垃圾收集过程中被释放,还是因为我从不调用dialog.removeEventListener它会永远存在于内存中?

小智 5

在你的榜样,你就不会需要删除事件侦听器.

为了防止内存泄漏,在这种情况下你唯一需要做的就是确保你声明var dialog而不仅仅是dialog(你做得很好).窗口关闭时,窗口内局部范围内的所有UI元素都将从内存中删除.如果声明全局引用,则可能导致内存问题.

现在有些情况下你必须删除事件监听器,那些是自定义事件监听器.专门为Ti.App对象添加自定义事件而不删除它们会给您带来很多麻烦.我通常不建议添加任何内容,但万一你确实需要它,你应该确保删除它,同时确保事件处理程序是一个命名函数.