Ajax客户端控制 - 内存泄漏

时间:2013-06-03 18:11:12

标签: javascript asp.net memory-leaks asp.net-ajax

我正在ASP.Net中创建一个Ajax客户端控件。通过继承IScriptControl然后添加相关的javascript类(它将继承自javascript控件)。我在以下代码中发现了内存泄漏:

Type.registerNamespace("mynamespace");

myClass = function (element) {

    myClass.initializeBase(this, [element]);
}

myClass.prototype = {

    initialize: function () {

        myClass.callBaseMethod(this, 'initialize');


        var me = this;

        $(document).ready(function () {

            me._initializeControl();
            me._hookupEvents();

        });

    },

    dispose: function () {
        //Add custom dispose actions here
        myClass.callBaseMethod(this, 'dispose');
    },
//...other code ... 

  _hookupEvents: function () {
        var me = this;
        var e = this.get_element();
        $("#viewRates", e).click(function () {
            me.openDialog();
        });

    },
//...other code... 
myClass.registerClass('myClass', Sys.UI.Control);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

_hoookupEvents是我的javascript文件中的一个函数。泄漏与me.openDialog相关。如果我删除此行,则没有泄漏。但是,我需要这一行能够从类中调用一个函数(我不能在函数中使用'this',因为它会引用该按钮)。有一个更好的方法吗?或者我可能只需要在dispose函数中调用一些方法来清理这些东西?

2 个答案:

答案 0 :(得分:1)

如果只有2个myclass实例,我会非常犹豫地称它为内存泄漏。如果有2000个myclass实例,那么肯定是泄密。 我会努力搜索你所拥有的任何动态实例化语句,它们会在某些条件下创建myClass。这就是我看到的很多(在应用程序初始化循环中创建类,也许表单提交可以触发实例化,并且没有完全QA来查看是否可以获得创建多个对象的提交等)。

答案 1 :(得分:1)

此代码中的内存泄漏可能发生在此行上,您还需要注意

    $("#viewRates", e).click(function () {
        me.openDialog();
    });

当您使用UpdatePanel调用它时,或者通常将其调用为同一个组件,并且首先清除以前的点击事件,之前的处理程序保持打开状态,这里我们有两个案例。

  • 要注册相同的点击事件而不是其中一个。
  • 使用ajax更新dom,而不是先前清除处理程序,因为之前的代码永远存在(永远==直到您离开页面)。

一般来说,解决方案是清除任何以前的点击处理程序,

  • 在添加新的之前。
  • 在使用UpdatePanel初始化新的ajax调用时,然后获取新的响应。

使用类似的函数删除单击并清除处理程序的资源。

this.get_events().removeHandler('click');