[Mono-osx] [MonoMac] NSMutableDictionary FromObjectsAndKeys problem

Miguel de Icaza miguel at novell.com
Tue Nov 16 00:43:12 EST 2010


Hello,

I started looking at it and there are two ways of approaching the problem
> that I found.
>

Oops, good catch!

I got a fix very similar to yours, they now both use [New] and I removed the
code that checked, as the underlying runtime should be catching that
anyways;

Miguel

>
> 1) The easiest was the following:
>
> Add the following to foundation.cs for interface NSMutableDictionary
> specifying [New]
>
>        [Export ("dictionaryWithObjects:forKeys:")]
>        [Static,New]
>        NSMutableDictionary FromObjectsAndKeys (NSObject [] objects,
> NSObject [] Keys);
>
> *** Note ***    If [New] is not specified it will not work correctly
> because it uses the base NSDictionary method and the Dictionary returned is
> not Mutable.
>
> Also commenting out the following code in NSMutableDictionary.cs
>
>        public static NSMutableDictionary FromObjectsAndKeys (NSObject []
> objects, NSObject [] keys)
>        {
>            if (objects.Length != keys.Length)
>                throw new ArgumentException ("objects and keys arrays have
> different sizes");
>            return FromObjectsAndKeys (objects, keys);
>        }
>
> 2)  The second approach was keeping the ArgumentException check in
> NSMutableDictionary.cs and defining a new internal method in foundation.cs
>
> NSMutableDictionary.cs
>
>        public static NSMutableDictionary FromObjectsAndKeys (NSObject []
> objects, NSObject [] keys)
>        {
>            if (objects.Length != keys.Length)
>                throw new ArgumentException ("objects and keys arrays have
> different sizes");
>            return FromObjectsAndKeysInternal (objects, keys);
>        }
>
> foundation.cs
>
>        [Export ("dictionaryWithObjects:forKeys:")]
>        [Static,Internal]
>        NSMutableDictionary FromObjectsAndKeysInternal (NSObject [] objects,
> NSObject [] Keys);
>
>
> I chose the second approach to keep the ArgumentException check in with the
> least amount of changes.
>
> Either one works.
>
> I have attached the diff if you choose the second one.
>
> Shouldn't NSDictionary include the same ArgumentException check as
> NSMutableDictionary if that is the way you decide?  Just for consistency if
> anything.
>
> Kenneth
>
>
>
>
> On 11/16/10 12:47 AM, Miguel de Icaza wrote:
>
>> Hello,
>>
>>  I am working with a mutable dictionary with bindings to an
>>> ArrayController
>>> and am having problems creating a NSMutableDictionary using the
>>> FromObjectsAndKeys.
>>>
>> Are you running the latest version from GitHub?
>>
>> On Friday or so, Geoff fixed an important bug with arrays in the Monomac
>> runtime.
>>
>>  It works for a NSDictionary but not when creating a NSMutableDictionary.
>>>
>>> The example code below shows what I am talking about.
>>>
>>>        var objects = new NSObject[3] {new NSString("AAAAA"),
>>>                                                new NSString("BBBBB"),
>>>                                                new NSString("CCCCCC")};
>>>
>>>        var keys = new NSObject[3] {new NSString("firstkey"),
>>>                                                new NSString("secondkey"),
>>>                                                new NSString("thirdkey")};
>>>
>>>        var dict2 = NSDictionary.FromObjectsAndKeys(objects,keys);
>>>
>>>        //var dict = NSMutableDictionary.FromObjectsAndKeys(objects,
>>> keys);
>>>        var dict = NSMutableDictionary.FromDictionary(dict2);
>>>
>>>        myContentArray.AddObject(dict);
>>>
>>> The implementation between NSDictionary.cs and NSMutableDictionary.cs are
>>> different for that method and not sure why.
>>>
>>> Any help would be appreciated
>>>
>>> Kenneth
>>>
>>> ----------------------------------
>>> If you uncomment the //var dict =
>>> NSMutableDictionary.FromObjectsAndKeys(objects, keys); it gives the
>>> following error:
>>>
>>> Stacktrace:
>>>
>>>   at (wrapper managed-to-native)
>>> MonoMac.ObjCRuntime.Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr_int
>>> (intptr,intptr,intptr,intptr,int)<0x00004>
>>>   at (wrapper managed-to-native)
>>> MonoMac.ObjCRuntime.Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr_int
>>> (intptr,intptr,intptr,intptr,int)<0x00004>
>>>   at MonoMac.Foundation.NSMutableDictionary.FromObjectsAndKeys
>>>
>>> (MonoMac.Foundation.NSObject[],MonoMac.Foundation.NSObject[],int)<0x00067>
>>>   at MonoMac.Foundation.NSMutableDictionary.FromObjectsAndKeys
>>> (MonoMac.Foundation.NSObject[],MonoMac.Foundation.NSObject[])<0x00028>
>>>   at NSTableViewBinding.TestWindowController.AwakeFromNib ()<0x001f8>
>>>   at (wrapper native-to-managed)
>>> object.92f48794-05ff-4e21-bcf0-61c0dd4bf42b
>>> (MonoMac.Foundation.NSObject,MonoMac.ObjCRuntime.Selector)<0x000cc>
>>>   at (wrapper managed-to-native)
>>> MonoMac.ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper (intptr,intptr)
>>> <0x00004>
>>>   at (wrapper managed-to-native)
>>> MonoMac.ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper (intptr,intptr)
>>> <0x00004>
>>>   at MonoMac.AppKit.NSWindowController.get_Window ()<0x00079>
>>>   at NSTableViewBinding.TestWindowController.get_Window ()<0x00012>
>>>   at NSTableViewBinding.AppDelegate.FinishedLaunching
>>> (MonoMac.Foundation.NSObject)<0x00038>
>>>   at (wrapper native-to-managed)
>>> object.00860f4e-27a8-4ca0-aa64-ae2828705416
>>>
>>> (MonoMac.Foundation.NSObject,MonoMac.ObjCRuntime.Selector,MonoMac.Foundation.NSObject)
>>> <0x00118>
>>>   at (wrapper managed-to-native)
>>> MonoMac.AppKit.NSApplication.NSApplicationMain (int,string[])<0x00004>
>>>   at (wrapper managed-to-native)
>>> MonoMac.AppKit.NSApplication.NSApplicationMain (int,string[])<0x00004>
>>>   at MonoMac.AppKit.NSApplication.Main (string[])<0x00015>
>>>   at NSTableViewBinding.MainClass.Main (string[])<0x00015>
>>>   at (wrapper runtime-invoke)<Module>.runtime_invoke_void_object
>>> (object,intptr,intptr,intptr)<0x00043>
>>>
>>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-osx/attachments/20101116/30d8731d/attachment-0001.html 


More information about the Mono-osx mailing list