On Sep 15, 2011, at 7:52 AM, Martyn Wendon wrote:
> I think that this turned out to be an incorrect (?) use of the "using"
> statement.....
I believe you are correct.
> What I was doing was (pseudo code):
>
> AbsoluteLayout al = new AbsoluteLayout(this);
>
> using (RotatingTextView rtv = new RotatingTextView())
> {
> rtv.somenewproperty = somevalue;
> al.AddView(rtv);
> }
>
> SetContentView(al);
Yeah, that's bad. :-)
As mentioned elsewhere, for every Java.Lang.Object subclass which is created in
managed code, a Java side object is created. Internally, we store a mapping
between the Java object's JNI handle and the managed object reference value:
Dictionary<IntPtr /* JNI handle */, WeakReference /* managed mapping
*/> instances;
Now, calling Java.Lang.Object.Dispose() _removes_ the JNI handle <-> object
mapping. This allows the Java GC to (eventually) collect the Java-side object,
and for Mono's GC to (eventually) collect the managed object; otherwise, both
objects will be kept alive.
When you use the `using` block as you do, you're removing the JNI mapping,
disassociating the Java object from the managed object.
When an overridden method is eventually invoked on the Java-side
RotatingTextView instance, Mono for Android will consult the instance mapping,
see that one doesn't exist, and _create_ a new managed object. This is why your
fields were always 0 -- it was a different object instance, mapped to the same
Java instance.
> I removed the "using" statement and it all started working as it should.
Yup, because the instance mapping is preserved. :-)
> Unless you think that this is still a bug, I won't file a bug report!!
Yes, this isn't a bug.
Thanks,
- Jon
_______________________________________________
Monodroid mailing list
[email protected]
UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid