2017-01-02 16 views
0

我在一个小的WebSocket项目的工作(使用Socket.io),在那里我用这样的一类:当对象被删除时,对象内的setInterval是否会阻止垃圾回收?

function myClass() { 
    // start server sync 
    window.setInterval(this.update.bind(this), 14); 

    // listen for socket.io events 
    io.on('my-event', doStuff); 
} 

有存储在一个数组类的多个实例。 一段时间后,该实例被删除这样的:

myArr.splice(index, 1); 

数组是唯一的位置,我存储在的情况下,所以我想,他们会被垃圾收集器被删除从数组中取出之后, 。

相反,我注意到,他们仍然响应我的websocket事件。我想知道如果间隔防止对象被删除,因为它被绑定到窗口对象。 删除类实例之前是否需要清除间隔?

或者事件侦听器是否阻止对象被删除?

回答

2

...的情况下被删除这样的:

myArr.splice(index, 1); 

......相反,我注意到,他们仍然对我的WebSocket事件作出响应。我想知道如果间隔防止对象被删除,因为它被绑定到窗口对象。在删除类实例之前,我需要清除间隔吗?

是的,你需要做更多的清理。您需要:

  • 清除的时间间隔,清理与它相关联的资源,使之释放其参考由this.update.bind(this)创建的功能(这反过来对对象的引用,保持它在内存中) 。

  • 删除任何事件侦听器(例如web套接字事件),这些事件侦听器将移除它们对事件处理函数的引用,这些事件处理函数可能具有对保存在内存中的对象的引用。

  • 确保还释放了对该对象的任何其他引用(直接或间接引用(如在任何其他绑定函数中))。

+0

谢谢,指出我需要做的步骤。我会尽快报告,因为我已经完成了这些步骤。 – Afterlame

0

是的,引用函数的值或范围可以防止它的垃圾邮件。

实际上,从函数到对象和范围的指针是JavaScript中内存泄漏的主要原因之一,这一类中最常见的是闭包,通常与事件回调(包括该类中的定时器)有关。

当你希望你的对象变成垃圾的时候,一定要注销所有的事件处理程序,并删除定时器(注意,当你从DOM中删除元素并且不保存对它的引用时删除事件处理程序) 。