Whilst diagnosing our application's memory leaks, I found that we have
places that use ChangeWatcher like this:

var cw1:ChangeWatcher = ChangeWatcher.watch(allocation, ["task", "phase",
"status"],statusChange, false, true);


The use of 'true' implying 'weak references' - to not hold a strong
reference to statusChange.

However-  because the ChangeWatcher chain has multiple values, this is
ignored for the latter parts of the list:

I.E: The source is this:


public static function watch(host:Object, chain:Object,

                                 handler:Function,

                                 commitOnly:Boolean = false,

                                 useWeakReference:Boolean =
false):ChangeWatcher

    {

        if (!(chain is Array))

            chain = [ chain ];

        if (chain.length > 0)

        {

            var w:ChangeWatcher =

                new ChangeWatcher(chain[0], handler, commitOnly,

                    watch(null, chain.slice(1), handler, commitOnly));

            w.useWeakReference = useWeakReference;

            w.reset(host);

            return w;

        }

        else

        {

            return null;

        }

    }


But the Constructor line *should* be:

 var w:ChangeWatcher =

                new ChangeWatcher(chain[0], handler, commitOnly,

                    watch(null, chain.slice(1), handler, commitOnly
,
*useWeakReference*
));


This seems to be the same issue as reported in FLEX-27837, which was
created over 2 years ago - marked as Major and 'easyfix'.

Is there a reason it hasn't been fixed (I.E: its behaviour is believed to
be correct) ? The way it is currently is really unexpected, and leaks
memory horribly - I can't believe we're the only users seeing this..

Reply via email to