Hi Carlos, 

Unfortunately you can't remove the binding when you use mx:Binding. You can use the BindingUtils.bindSetter to create a changeWatcher and remove the binding when the Canvas is removed. I modified your MyScreen.mxml and it now returns "modified" twice as you would expect.

http://livedocs.macromedia.com/flex/2/langref/mx/binding/utils/BindingUtils.html

[Modified CODE -- MyScreen.mxml]

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas removed="removeBind()" initialize="addBinding()" xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
                 
         // import the binding utils.
         import mx.binding.utils.*;
        
         // create a ChangeWatcher.
         public var watcherSetter:ChangeWatcher;

   private function addBinding():void
   {
    // using bindSetter to set this to your setter function.
              watcherSetter = BindingUtils.bindSetter(dest, ModelLocator.getInstance(), "testVar");
   }
   
   private function removeBind():void
   {
    // on remove of the Canvas unwatch the bind.
    watcherSetter.unwatch();
   }
   
            protected function dest (d:String):void
            {
             // should now only display twice.
               trace ("modified");
            }
        ]]>
    </mx:Script>
    <mx:Text text="hola mundo"/>
</mx:Canvas>

[/CODE]

-Kurt.

--- In flexcoders@yahoogroups.com, "Carlos Rovira" <[EMAIL PROTECTED]> wrote:
>
> Hi Xavi,
>
> I tried your code and see the problem. Maybe someone at Adobe could tell us
> some method or technique to avoid this behaviour. This is very important due
> to the huge use bindings have in a common Flex application. In normal
> applications we must to remove childs to improve memory management and
> performance in the overall application if bindings make this stop working we
> end with a memory-leak caused by the flex application.
>
> At first, we could think in a way to remove the binding (but I don't now how
> to do that at the moment, someone knows the way?) but if we must to do it
> manually it would be a bit unnatural and a patch.
>
> Hope someone at Adobe could throw some light into this important issue.
>
> On 11/8/06, Xavi Beumala [EMAIL PROTECTED] wrote:
> >
> > Hi there,
> >
> > I'm experiencing some weird behaviour when using Bindings. In short, when
> > I remove some object from the DisplayList which has declared any Binding,
> > the garbage doesn't destroy this object from memory causing unwanted binding
> > triggers and an innecesary increase of memory usage.
> >
> > Here's an example which isolates the problem. It consists in 2 mxml's (
> > Main.mxml and MyScreen.mxml) and 1 .as. (ModelLocator.as)
> >
> > Main.mxml consists of one button and an empty mx:Canvas. When the button
> > is clicked three actions are taken:
> > 1. A property in the ModelLocator is increased by one.
> > 2. Remove all canvas children.
> > 3. Create a new instance of MyScreen component
> > 4. Add the MyScreen instance to the canvas displayList.
> >
> > On the other hand, MyScreen.mxml just declares a binding from the testVar
> > property declared in the ModelLocator to a setter. In this setter a simple
> > trace is performed.
> >
> > The problem is seen when clicking several times the button.
> > 1. The first time you click it only one trace is printed.
> > 2. The second time you click it, the trace is performed twice. One
> > for the new created instance an one for the removed one.
> > 3. The third time you click it, the trace is performed 3 times, one
> > for each instance of MyScreen that has been previously been instanciated.
> > 4. and so on...
> >
> > I'm not sure if this is a bug or not, but I think it's not the expected
> > behaviour and lots of applications can suffer a serious decrease of
> > performance due to this issue. I've been digging on the auto generated code
> > trying to isolate where the bindings where declared. I'm not sure, but maybe
> > the problem has to be something with weakreferences.
> >
> > So the question is, how could I workarround this? Is there anyway I can
> > force binding to stop working? remove it? or whatever? maybe declare it as a
> > weakreference and not as a strong reference?
> >
> > Help is much apreciated!
> >
> > Here's the isolated code:
> >
> > [CODE --- main.mxml]
> > <?xml version="1.0" encoding="utf-8"?>
> > <mx:Application
> > xmlns:mx="http://www.adobe.com/2006/mxml "
> > layout="vertical" >
> >
> > <mx:Script>
> > <![CDATA[
> > private var i:int = 0;
> >
> > private function loadChild():void
> > {
> > ModelLocator.getInstance().testVar = i++;
> >
> > container.removeAllChildren();
> > var s:MyScreen = new MyScreen();
> > container.addChild (s);
> > }
> > ]]>
> > </mx:Script>
> >
> > <mx:Button label="load" click="loadChild()"/>
> > <mx:Canvas id="container" width="100%" height="100%"/>
> > </mx:Application>
> > [/CODE]
> >
> > [CODE -- MyScreen.mxml]
> > <?xml version="1.0" encoding="utf-8"?>
> > <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml ">
> > <mx:Script>
> > <![CDATA[
> > protected function set dest (d:String):void
> > {
> > trace ("modified");
> > }
> > ]]>
> > </mx:Script>
> >
> > <mx:Binding source="ModelLocator.getInstance().testVar"
> > destination="dest"/>
> >
> > <mx:Text text="hola mundo"/>
> > </mx:Canvas>
> > [/CODE]
> >
> >
> > [CODE -- ModelLocator.as]
> > package {
> > [Bindable]
> > public class ModelLocator {
> > private static var instance:ModelLocator;
> >
> > public function ModelLocator() {
> > instance = this;
> > }
> >
> > public static function getInstance():ModelLocator {
> > if (instance == null) {
> > instance = new ModelLocator();
> > }
> >
> > return instance;
> > }
> >
> > public var testVar:int;
> > }
> > }
> > [/CODE]
> >
> >
> > Thanks so much
> > X.
> >
> > P.D: this is the third time I send this question, hope this time someone
> > can help :-)
> >
> >
>
>
>
> --
> ::| Carlos Rovira
> ::| http://www.carlosrovira.com
> ::| http://www.madeinflex.com
>

__._,_.___

--
Flexcoders Mailing List
FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com





SPONSORED LINKS
Software development tool Software development Software development services
Home design software Software development company

Your email settings: Individual Email|Traditional
Change settings via the Web (Yahoo! ID required)
Change settings via email: Switch delivery to Daily Digest | Switch to Fully Featured
Visit Your Group | Yahoo! Groups Terms of Use | Unsubscribe

__,_._,___

Reply via email to