ASP.NET Ajax在jQuery中处理模式的等价物?

Ram*_*esh 1 javascript jquery memory-leaks asp.net-ajax

ASP.NET Ajax,具有一个IDisposable接口,可让您释放资源,从而具有一种处置模式.

  1. 如何在jQuery中完成资源的释放?有没有类似的模式?
  2. ASP.NET Ajax库如何/何时调用dispose函数?
  3. 如果页面在一段时间后重新加载,我们是否必须担心内存泄漏?

Cre*_*esh 14

如何在jQuery中完成资源的释放?有没有类似的模式?

jQuery将处理使用附加到DOM元素的分离事件处理程序bind().因此,与开发人员负责分离事件处理程序本身相比,对DOM元素的悬空引用应该少得多.但是,它仅在页面卸载时(即对象的unload事件window)执行此操作.那时它迭代它的事件cache(jQuery.cache)并从元素中删除事件监听器,这样浏览器就可以推断出那些元素不再被引用并回收它们使用的内存.

IDisposablejQuery中没有模式.对于您自己的对象,您必须自己管理处理.$(window).bind('unload', myCleanupFunction)这是一个很好的开始.简单地dispose在对象上实现一个方法,并在此清理函数中调用它没有任何问题.

从广义上讲,任何可以/可能具有循环引用的对象属性或全局变量都应该被特别注意并被销毁(delete或者null足够).应删除或取消对DOM元素的任何引用.应删除或删除对DOM元素周围关闭的闭包的任何引用(事件处理程序是此模式的常见来源).如果从DOM中删除元素,请执行此操作remove(),这将自动清除元素中的jQuery绑定事件处理程序.

ASP.NET Ajax库如何/何时调用dispose函数?

与jQuery一样,ASP.NET AJAX框架挂钩对象的unload事件window以执行一些引用清理.在Sys.Application.dispose调用页面时,会发生以下情况:

  1. 如果已pageUnload()在应用程序中创建了一个函数,则会调用该函数
  2. 它会调用dispose()您已在应用程序中注册的任何对象.
  3. 它引发了应用程序unload事件.
  4. 它处理ScriptLoader实例.

默认情况下,ASP.NET AJAX组件,控件和行为在Sys.Application创建组件时(在Sys.Component构造函数中)随对象自动注册.继承的任何内容都会在实例化时IDisposable自动注册到框架中(并放入Sys.Application._disposableObjects).

对于实现的对象,调用实例IDisposabledispose()方法(就像在服务器上一样).但是,您仍然负责实际释放引用(就像在服务器上一样).

如果仍然需要注意方法中的对象deletenull属性dispose.与jQuery相同的规则适用于此:应该特别注意任何可以/可能具有循环引用的对象属性或全局变量,应该删除或取消对DOM元素的引用,应该删除或禁用对封闭在DOM元素周围的闭包的引用.

然而,与jQuery不同,当页面卸载1时,ASP.NET AJAX不会自动删除您绑定的侦听器Sys.UI.DomEvent.addHandler(也称为$addHandler).你必须自己照顾这个.然而,该框架确实提供(aka )来轻松地执行此操作.您可以在实现中调用它,并将附加了事件侦听器的任何元素传递给框架.Sys.UI.DomEvent.clearHandlers(element)$clearHandlersdispose()

IDisposable在客户端中,它更像是一个放置"卸载"代码的便利位置,也是代码自我编写文档的一种方式.我怀疑大多数人在应用程序的生命周期中没有创建和处理许多对象,而是在页面加载时创建它们一次,并在页面卸载时销毁它们一次.

如果页面在一段时间后重新加载,我们是否必须担心内存泄漏?

在不经常卸载的DOM树中分析内存已经付出了很多努力.通常,如果页面经常卸载(包括导航到应用程序中其他页面的用户),则不必过于担心.如果它是一个长期存在的应用程序(例如gmail),你必须非常小心地记忆泄漏.对于长期存在的应用程序,内存遏制不应被视为过早优化,而是非常明显的可能性.虽然它不会成为性能瓶颈(与I/O说的相反),但在今天的应用程序中,DOM让浏览器只是处理它是一种太多的野兽.然而,管理这个是非常棘手的.


1 此功能以autoRemove参数形式发布到4.0版Sys.UI.DomEvent.addHandler