2013-06-03 65 views
1

我正在ASP.Net中创建一个Ajax客户端控件。从IScriptControl继承,然后添加相关的JavaScript类(它将继承自一个javascript控件)。我已经找到了内存泄漏下面的代码:Ajax客户端控制 - 内存泄漏

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

您是如何检测到泄漏的?你有没有泄漏的物体或元素的想法? –

+0

使用Chrome开发人员工具 - 堆快照。如果我离开那行代码,我可以看到有2个myclass实例(当我做回发时)。我删除了代码行......并且只有一个实例(即使在几次回发之后)。 –

+0

我想你的意思是回发是用UpdatePanel完成的。 – Aristos

回答

1

这段代码的内存泄漏可能发生在这条线,你也注意到

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

当你的UpdatePanel调用它,或在一般叫它为同一部件,并与出先清除以前点击事件,之前的处理程序停留在这里,这里我们有两种情况。

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

一般的解决办法是清除以前的处理程序,点击,

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

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

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

1

如果只有2个myclass实例,我非常犹豫称它为内存泄漏。如果有2,000个myclass实例,那么肯定是泄漏。 我真的很难搜索任何动态实例化语句,这些语句在特定条件下创建myClass。这就是我所看到的很多(在应用程序init处创建循环中的类,也许表单提交可能触发实例化,并且它没有完全查询是否可以获得创建多个对象的提交等)。