I finally narrowed this down to a smaller test case that shows what I 
think is a bug. Here is the bug report:
https://bugzilla.xamarin.com/show_bug.cgi?id=6338

The missing piece from my previous attempts to reproduce it in a smaller 
example was a UINavigationController. Having one of those in the picture 
is somehow convincing the runtime that it needs to reconstruct my managed 
object, and I don't think it should need to in this case. I have a 
workaround now (dispose the navigation controller as well), but I filed 
the bug report anyway so maybe someone can explain what's going on.

Thanks.
--
Adam Kemp
adam.k...@ni.com
(512) 683-6058

Nic Wise <n...@fastchicken.co.nz> wrote on 07/30/2012 04:05:54 PM:

> From: Nic Wise <n...@fastchicken.co.nz>
> To: Adam Kemp <adam.k...@ni.com>
> Cc: monotouch@lists.ximian.com, Rolf Bjarne Kvinge 
> <r...@xamarin.com>, Sebastien Pouliot <sebast...@xamarin.com>
> Date: 07/30/2012 04:05 PM
> Subject: Re: [MonoTouch] When to implement Foo(IntPtr) constructors
> 
> Hi Adam
> 
> If you have a reproducible case, make a bugzilla bug with it
> (bugzilla.xamarin.com) and email support@xamarin with a reference to
> it. They can then assign it to the right person to have a look at.
> 
> Thanks
> 
> Nic
> 
> 
> 
> On Mon, Jul 30, 2012 at 2:26 PM, Adam Kemp <adam.k...@ni.com> wrote:
> > Thanks for the response, Nic. That explanation makes sense to me, but 
it
> > doesn't really answer why in this particular case the MonoTouch 
runtime
> > wants to resurrect the managed object. I am in fact releasing my last
> > reference to that object, but that is because I really am completely 
done
> > with it. It should actually be leaving memory. That is, when that 
managed
> > reference goes away the unmanaged reference should leave memory as 
well.
> >
> > What's happening in this case is that the UIViewController base class
> > subscribes to a notification for low memory warnings. I am releasing 
my
> > last managed reference to this view controller in my own handler for 
low
> > memory warnings (in a different view controller), but something 
(perhaps
> > an autorelease call?) is keeping the view controller I want to go away 
to
> > stay in memory long enough to want to handle that low memory 
notification.
> > This is the behavior that I can reproduce in a test project. However, 
in
> > my test project I can only get it to reproduce if I override 
ViewDidUnload
> > or DidReceiveMemoryWarning in the view controller that I want to go 
away.
> > In my real project I didn't implement either one of those, and yet it 
is
> > being resurrected anyway. As I said, the only method I override in 
this
> > view controller class is ViewDidLoad, and that method is not being 
called.
> > Why would the runtime try to reconstruct the managed object if it's 
not
> > needed by anything? If I could get some kind of hint in the debugger 
about
> > why it's being reconstructed then that would help.
> >
> > My main concern is that in this case if I can't release the reference 
to
> > this view controller here then I'm not sure where I could safely 
release
> > it. The view controller is no longer on screen. It shouldn't be 
referenced
> > by anything else. There's no reason I can think of that it shouldn't 
be
> > safe to allow it to leave memory at this point. I'd like to get to the
> > bottom of why it is being resurrected.
> > --
> > Adam Kemp
> > adam.k...@ni.com
> > (512) 683-6058
> >
> > Nic Wise <n...@fastchicken.co.nz> wrote on 07/30/2012 01:01:26 PM:
> >
> >> From: Nic Wise <n...@fastchicken.co.nz>
> >> To: Adam Kemp <adam.k...@ni.com>
> >> Cc: monotouch@lists.ximian.com, Sebastien Pouliot
> >> <sebast...@xamarin.com>, Rolf Bjarne Kvinge <r...@xamarin.com>
> >> Date: 07/30/2012 01:01 PM
> >> Subject: Re: [MonoTouch] When to implement Foo(IntPtr) constructors
> >>
> >> Hi Adam
> >>
> >> You really need a reply from Rolf or Sebastian, but they are in 
Boston
> >> at the moment at the (annual?) company meetup. I've CCed them, but I
> >> dont know how much spare time they have this week.
> >>
> >> So, just so this doesn't drop off the bottom of the list, this SO 
item
> >> from Miguel explains it well:
> >>
> >> http://stackoverflow.com/questions/5623223/no-constructor-found-for-
> >> viewcontroller-ctorsystem-intptr
> >>
> >> I suspect that it might be a case where you need to keep a reference
> >> to the object in a class-local variable, rather than a method-local
> >> one or just assigning it to a (obj-c?) object.
> >>
> >> I've never really implemented them, tho maybe I should :). I used to
> >> have the same exceptions as this, but I've not seen it in live debug
> >> logs for ages - it's possible that the GC got fixed (or improved)
> >>
> >> Drop the list an email back if that doesn't answer your question
> >>
> >> Cheers
> >>
> >> Nic
> >>
> >> On Fri, Jul 27, 2012 at 8:10 PM, Adam Kemp <adam.k...@ni.com> wrote:
> >> > I'm hitting a crash when receiving memory warnings in some 
situations.
> > In
> >> > one view controller (A) we are handling the memory warning by 
calling
> >> > Dispose() on another view controller (B) which is no longer 
necessary.
> >> > Unfortunately, something later on during the process of the 
(native)
> >> > memory warning handling code is trying to call a method in view
> > controller
> >> > B, and it's trying to construct a managed object to do so. This 
causes
> > an
> >> > exception because I don't have a constructor which takes an IntPtr 
so
> > the
> >> > runtime can't construct the managed object.
> >> >
> >> > I know that if implementing the IntPtr constructor the crash 
doesn't
> >> > occur. I also know that it goes away if I remove the call to 
Dispose,
> > but
> >> > I don't think that's a guaranteed fix since the object could still 
be
> >> > GCed. I'm looking for the "right" fix, but I have several 
unanswered
> >> > questions about what is going on that I need to find an answer to 
in
> > order
> >> > to find it.
> >> >
> >> > The first question is what method is being called on view 
controller
> > B,
> >> > and why is it wanting a managed object to call that method? I don't
> > have
> >> > an override for DidReceiveMemoryWarning or ViewDidUnload. In fact, 
the
> >> > only override in that view controller (which inherits directly from
> >> > UITableViewController) is ViewDidLoad. The exception tells me
> > "Selector
> >> > invoked from objective-c on a managed object (0xB9E72D0) that has 
been
> >> > GC'ed", but it won't tell me which selector was invoked. In a 
simpler
> > test
> >> > case that I created I could only reproduce the crash if I overrode
> > either
> >> > DidReceiveMemoryWarning or ViewDidUnload, but in my full 
application I
> > get
> >> > the crash even though I haven't implemented either. I don't 
understand
> >> > why. Is there a trick to figuring out which method is being invoked
> > when
> >> > this exception occurs?
> >> >
> >> > The second question is what are the rules for when we are expected 
to
> >> > implement the IntPtr constructor for classes that inherit from
> > NSObject? I
> >> > don't want to blindly add it to every class, especially since in 
some
> >> > cases it probably can't be implemented in a sane way at all (the
> > Dispose
> >> > method might have released resources that you can't get back 
without
> >> > arguments from a real constructor). Is there some rule for this? 
Does
> > my
> >> > situation fit that rule?
> >> >
> >> > Thanks.
> >> > --
> >> > Adam Kemp
> >> > adam.k...@ni.com
> >> > (512) 683-6058
> >> > _______________________________________________
> >> > MonoTouch mailing list
> >> > MonoTouch@lists.ximian.com
> >> > http://lists.ximian.com/mailman/listinfo/monotouch
> >>
> >>
> >>
> >> --
> >> Nic Wise
> >> t.  +44 7788 592 806 | @fastchicken | 
http://www.linkedin.com/in/nicwise
> >> b. http://www.fastchicken.co.nz/
> >>
> >> mobileAgent (for FreeAgent): get your accounts in your pocket.
> >> http://goo.gl/IuBU
> >> Trip Wallet: Keep track of your budget on the go: http://goo.gl/ePhKa
> >> Earnest: Self-employed? Track your business expenses and income.
> >> http://earnestapp.com
> >> Nearest Bus: find when the next bus is coming to your stop. http://
> >> goo.gl/Vcz1p
> >> London Bike App: Find the nearest Boris Bike, and get riding!
> >> http://goo.gl/Icp2
> >
> 
> 
> 
> -- 
> Nic Wise
> t.  +44 7788 592 806 | @fastchicken | http://www.linkedin.com/in/nicwise
> b. http://www.fastchicken.co.nz/
> 
> mobileAgent (for FreeAgent): get your accounts in your pocket.
> http://goo.gl/IuBU
> Trip Wallet: Keep track of your budget on the go: http://goo.gl/ePhKa
> Earnest: Self-employed? Track your business expenses and income.
> http://earnestapp.com
> Nearest Bus: find when the next bus is coming to your stop. http://
> goo.gl/Vcz1p
> London Bike App: Find the nearest Boris Bike, and get riding! 
> http://goo.gl/Icp2

_______________________________________________
MonoTouch mailing list
MonoTouch@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/monotouch

Reply via email to