我正在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函数中调用一些方法来清理这些东西?
答案 0 :(得分:1)
如果只有2个myclass实例,我会非常犹豫地称它为内存泄漏。如果有2000个myclass实例,那么肯定是泄密。 我会努力搜索你所拥有的任何动态实例化语句,它们会在某些条件下创建myClass。这就是我看到的很多(在应用程序初始化循环中创建类,也许表单提交可以触发实例化,并且没有完全QA来查看是否可以获得创建多个对象的提交等)。
答案 1 :(得分:1)
此代码中的内存泄漏可能发生在此行上,您还需要注意
$("#viewRates", e).click(function () {
me.openDialog();
});
当您使用UpdatePanel调用它时,或者通常将其调用为同一个组件,并且首先清除以前的点击事件,之前的处理程序保持打开状态,这里我们有两个案例。
一般来说,解决方案是清除任何以前的点击处理程序,
使用类似的函数删除单击并清除处理程序的资源。
this.get_events().removeHandler('click');