Joseph Caruana
Joseph Caruana

Reputation: 2271

Ajax Client Control - memory leak

I am creating an Ajax Client Control in ASP.Net. By inheriting from IScriptControl and then adding the relavant javascript class (which would inherit from a javascript control). I have found a memory leak in the following code:

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 is a function in my javascript file. The leak is related ot the line me.openDialog. If I remove this line, there is no leak. However, I need this line to be able to call a function from the class (I cannot just use 'this' in the function because it would refer to the button). Is there a better way to do this? Or maybe I just need to call some methods in the dispose function to clean such things?

Upvotes: 1

Views: 301

Answers (2)

Aristos
Aristos

Reputation: 66641

The memory leak at this code can happen on this line, as you also note

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

when you call it with UpdatePanel, or in general call it for the same component and with out first clear the previous events for the click, the previous handler stay on, and here we have two cases.

  • To register the same click event more than ones.
  • To update the dom with ajax, and not previous clear that handlers, as results the previous code stay for ever (for ever == until you leave the page).

In general the solution is to clear any previous handler for the click,

  • before add a new one.
  • when initialize a new ajax call with UpdatePanel and before get the new response.

Use a function like that to remove the click and clear the resource for the handler.

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

Upvotes: 1

dudewad
dudewad

Reputation: 13933

I'm extremely hesitant to call it a memory leak if there are only 2 instance of myclass. If there are 2,000 instances of myclass there's DEFINITELY a leak. I'd search real hard for any dynamic instantiation statements that you have, that create myClass on certain conditions. That is what i see a lot (creating classes in loops at application init, perhaps a form submit can trigger instantiation and it wasn't fully QA'd to see if you can get a submission to create multiple objects, etc).

Upvotes: 1

Related Questions