如何从循环对象中释放内存

时间:2009-05-31 19:08:41

标签: javascript memory-leaks javascript-framework

我正在尝试动态更新使用Prototip和Prototype制作的工具提示。我试图这样做的方式可能不是最好的方式(所以如果你知道一个更好的方法会有帮助),但我能想到的唯一方法就是将javascript保存在div元素中并更新div元素中的javascript以更新工具提示。但是,这似乎是内存泄漏,因为每次更新javascript时,都会创建一个新的Tip对象并将其存储在内存中。如果没有更好的方法,我该如何清除记忆?

我制作了这个简单的脚本来测试内存泄漏,现在我需要弄清楚如何制作它以便在这个例子中修补内存泄漏。

for (i=0; i<1000; i++) {
    $('testdiv').update("<script type='text/javascript'> new Tip('chips_tip', 'Your Chips', {style: 'creamy',stem: 'topLeft',hook: { mouse: true, tip: 'topLeft' },offset: { x: 10, y: 16 },delay: 0.04,width: 85}); <\/script>");
}

以下是工具提示的javascript通常是:

new Tip('element', "Description", {
    style: 'creamy',
    stem: 'topLeft',
    hook: { mouse: true, tip: 'topLeft' },
    offset: { x: 10, y: 16 },
    delay: 0.04,
    width: 85
});

4 个答案:

答案 0 :(得分:1)

似乎新的Tip构造可以使用元素而不是工具提示文本作为参数。您可能想尝试使用它。我没有这样做,所以你必须自己尝试。首先,创建工具提示布局(包含工具提示文本的div标签)并像往常一样设置样式。将此div的style属性设置为“display:none”。然后尝试创建这样的提示:

new Tip('source', $('tooltip_container'));

然后,您可以使用以下方式更改工具提示的文本:

$('tooltip_container').update('new tooltip text');

将tooltip构造分配给全局空间中的变量是不够的,因为在我看来prototip会将它自己的工具提示html内容插入到dom中。我的猜测是,每当你打电话给“新提示”时,你都会在dom中添加额外的html。然后这些对象引用dom节点,因此它们永远不会被垃圾收集。您可以轻松地使用测试代码和firebug检查dom。

最后一个选项是查看prototip源代码,看它是否有某种setTooltipText函数。然后你可能会做这样的事情:

var tooltip = new Tip('element', 'text');
// snip
tooltip.setText('some new text');

如果这没有帮助,只需发送电子邮件至prototip的作者。我相信他会很乐意提供帮助。

答案 1 :(得分:0)

正如您所注意到的那样,简单地实例化一个新提示将意味着创建一个新的Tip对象并将其存储在内存中。

要解决此问题,您需要将Tip分配给全局范围中的唯一变量。 即实例化变量“tooltip”,然后在你的例程中使用“tooltip = new Tip”(这将允许一次只使用1个工具提示,我认为这是你想要的,因为只有一个可以显示)。垃圾收集应该照顾其余部分。

答案 2 :(得分:0)

通过实例化“Tip”对象,您实际执行构造函数调用,例如简单的函数调用,相应地处理和更新可视元素,但是一旦这个对象没有被任何变量引用它应该被垃圾收集器收集。如果你想确定,你可以做下一个:

var tip = new Tip( whatever);
// before next update do delete tip;

答案 3 :(得分:0)

看起来这实际上是Prototype中的内存泄漏。 According to this,泄漏在1.6.1

中得到修复