Hi Dave,
I have encountered the same WebAssistant problem (with the "You backtracked
too far" message) and read your workaround solution, hoping it would work
for me too.
However, I don“t really get how do you assign the local trackingObserver
instance (in the _enableTracking method) to your the D2W._Observer ivar in
the Application class.

Could you please paste an example of the solution? Does the solution imply
to recompile the D2W class?

Thanks in advance.

--Cuauhtemoc



On Jan 18, 2008, at 10:37 PM, David Elliott wrote:

Hi,
>
> I am just starting to play with WO again after having worked on some
> other stuff and have come across what I believe to be a bug in the D2W
> class.  I tried googling the "WebAssistant: You backtracked too far"
> error message with no positive results and finally decided to track it
> down myself.
>
> What I came up with appears to be a weak reference problem with the
> D2W._Observer instance used to observe the
> WORequestHandlerDidHandleRequestNotification.  For other notifications
> including that same notification as used to call the willCheckRules
> method, the D2W singleton itself is registered with
> NSNotificationCenter.
>
> The relevant (decompiled) code is as follows:
>
> class D2W {
> ...
>
>     static {
>         ...
>         NSNotificationCenter.defaultCenter().addObserver(factory(),
> new NSSelector("willCheckRules", _NotificationArray),
> "WORequestHandlerDidHandleRequestNotification", null);
>     }
> ...
> };
>
> But the requestWasHandled method is registered indirectly (why!?)
> through an inner class:
>
> class D2W {
> ...
>
>     public class _Observer
>     {
>
>         public void requestWasHandled(NSNotification n)
>         {
>             Object object = n.object();
>             if(object instanceof WOContext)
>                 D2W.factory().requestWasHandled((WOContext)object);
>         }
>
>         final D2W this$0;
>
>         public _Observer()
>         {
>             this$0 = D2W.this;
>             super();
>         }
>     }
>
> ...
>     private void _enableTracking()
>     {
>         if(!_trackingEnabled)
>         {
>             Object trackingObserver = new _Observer();
>
> NSNotificationCenter.defaultCenter().addObserver(trackingObserver, new
> NSSelector("requestWasHandled", new Class[] {
>                 com/webobjects/foundation/NSNotification
>             }), "WORequestHandlerDidHandleRequestNotification", null);
>             _trackingEnabled = true;
>         }
>     }
> ...
> };
>
>
> By dropping into the Eclipse debugger on NSNotificationCenter and
> stepping through until it finally fills in its targets stack variable
> I was able to inspect the contents and determine that the target
> object which should be an instance of D2W._Observer is instead null.
> I suspect that the NSNotificationCenter must therefore only weakly
> reference its targets such that it does not keep them from getting
> garbage collected.  I'm reasonably sure that's an intentional design
> and is certainly a good thing in light of the recent story about the
> university students competing in the DARPA challenge who were oh so
> surprised when they found a "memory leak" in their .NET app because
> their notification center was referencing its targets.
>
> I am able to fix this by adding a D2W._Observer ivar to my Application
> class and basically using the above code from the _enableTracking()
> method except setting the ivar to the new _Observer instance rather
> than using a stack variable.  With that code in place I am once again
> able to use the Customize button from my D2W app.
>
> Of course I still haven't gotten WOLips to tell WebAssistant to save
> the file to the source code directory (it saves to the bundled copy
> which gets overwritten on the next build) but it's progress nonetheless.
>
> Has anyone else seen this bug or reported it?  Should I go ahead and
> do that?  It seems to me that the simple fix is to just add a
> requestWasHandled(NSNotification) overload directly to D2W rather than
> using an inner class.
>
> -Dave
>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to