ASP.NET Ajax通过具有IDisposable接口可以使您释放资源,从而具有处置模式。
如何在jQuery中释放资源?有没有类似的模式?
ASP.NET Ajax库如何/何时调用dispose函数?
如果一段时间后页面将重新加载,我们是否需要担心内存泄漏?
最佳答案
如何在jQuery中释放资源?有没有类似的模式?
jQuery将使用bind()
处理附加到DOM元素的分离事件处理程序。因此,与开发人员负责分离事件处理程序本身的情况相比,对DOM元素的悬挂引用应该少得多。但是,仅在页面卸载时(即unload
对象的window
事件)才执行此操作。那时,它会迭代其事件缓存(jQuery.cache
)并从元素中删除事件侦听器,以便浏览器可以推断出不再引用这些元素并回收它们使用的内存。
jQuery中没有说服的IDisposable
模式。对于您自己的对象,必须自己处理。 $(window).bind('unload', myCleanupFunction)
是一个很好的开始。只需在对象上实现dispose
方法并从此清理函数中调用它,就没有错。
概括地说,应特别注意并销毁可以/可能具有循环引用的任何对象属性或全局变量(delete
or null
就足够了)。对DOM元素的任何引用都应删除或为空。围绕DOM元素闭合的对closures的任何引用都应删除或为空(事件处理程序是此模式的常见来源)。如果从DOM中删除元素,请使用remove()
删除,这将自动从元素中清除jQuery绑定的事件处理程序。
ASP.NET Ajax库如何/何时调用dispose函数?
与jQuery一样,ASP.NET AJAX框架也挂接到unload
对象的window
事件中以执行一些引用清除。卸载页面后,将调用Sys.Application.dispose
并the following occurs:
如果您在应用程序中创建了pageUnload()
函数,则该函数称为
它在您已向应用程序注册的任何对象上调用dispose()
。
它引发Application unload
事件。
它处理ScriptLoader
实例。
默认情况下,创建ASP.NET AJAX组件,控件和行为时,它们会自动在Sys.Application
对象中注册(在Sys.Component
构造函数中)。从IDisposable
继承的任何内容在实例化后都会自动registered with the framework(并放置在Sys.Application._disposableObjects
中)。
对于实现IDisposable
的对象,将调用您实例的dispose()
方法(就像在服务器上一样)。但是,您仍然要负责释放引用(就像在服务器上一样)。
IOW,您仍然需要注意delete
方法中对象的null
或dispose
属性。与jQuery相同的规则在这里适用:任何可能/可能具有循环引用的对象属性或全局变量都应给予特别注意,对DOM元素的引用应删除或为空,对围绕DOM元素关闭的闭包的引用应删除或为空。 。
但是,与jQuery不同,ASP.NET AJAX不会在页面卸载1时自动删除与Sys.UI.DomEvent.addHandler
(也称为$addHandler
)绑定的侦听器。您必须小心自己执行此操作。框架确实提供了Sys.UI.DomEvent.clearHandlers(element)
(又名$clearHandlers
)来轻松实现此目的。您可以在dispose()
实现中调用它,并将在框架中附加了事件侦听器的所有元素都传入。
客户端中的IDisposable
不仅是放置“卸载”代码的方便位置,而且是代码自行进行自我文档编制的一种方式。我怀疑大多数人不会在其应用程序的生存期内创建和处置许多对象,而是在页面加载一次创建它们,并在页面卸载一次销毁它们。
如果一段时间后页面将重新加载,我们是否需要担心内存泄漏?
在不经常卸载的DOM树中对内存进行性能分析已付出了很多努力。通常,如果页面经常卸载,您不必太担心(这包括导航到应用程序中其他页面的用户)。如果是长期应用程序(例如
gmail),您必须格外小心以免发生内存泄漏。对于寿命长的应用程序,不应将内存容纳视为过早的优化,而应将其视为非常明显的可能性。当然,这不会成为性能瓶颈(与I / O相比),但是在当今的应用程序中,DOM实在是太让人讨厌了,无法让浏览器来处理它。但是,对此的管理非常棘手。
1此功能以autoRemove
参数的形式传入4.0版
关于javascript - ASP.NET Ajax Dispose模式等效于jQuery吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713094/