1

我正在 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();

_hookupEvents 是我的 javascript 文件中的一个函数。泄漏与 me.openDialog 行有关。如果我删除这条线,就没有泄漏。但是,我需要这一行才能从类中调用函数(我不能只在函数中使用“this”,因为它会引用按钮)。有一个更好的方法吗?或者也许我只需要调用 dispose 函数中的一些方法来清理这些东西?

4

2 回答 2

1

正如您还注意到的那样,此代码的内存泄漏可能发生在这一行

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

当您使用 UpdatePanel 调用它时,或者通常为同一个组件调用它并且没有首先清除单击的先前事件时,先前的处理程序保持打开状态,这里有两种情况。

  • 注册多个相同的点击事件。
  • 用 ajax 更新 dom,而不是以前清除该处理程序,结果以前的代码永远保留(永远 == 直到您离开页面)。

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

  • 在添加一个新的之前。
  • 在使用 UpdatePanel 初始化新的 ajax 调用时以及在获得新响应之前。

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

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

于 2013-06-03T18:36:24.003 回答
1

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

于 2013-06-03T18:29:01.233 回答