Re: Bindings Problem
Re: Bindings Problem
- Subject: Re: Bindings Problem
- From: Ken Thomases <email@hidden>
- Date: Mon, 18 Jan 2010 15:55:56 -0600
On Jan 18, 2010, at 11:01 AM, Jeffrey Oleander wrote:
> http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Collections/Articles/Sets.html
>
> "Set Fundamentals: Note that if mutable objects are stored in a set, either the hash method of the objects shouldn’t depend on the internal state of the mutable objects or the mutable objects shouldn’t be modified while they’re in the set (note that it can be difficult to know whether or not a given object is in a collection)."
>
> So, you can use your own hash function to determine where in the set each item is stored. In this case, each item stored in the set is an NSMutableDictionary.
And... you can't change the hash function used by NSMutableDictionary. So, for a custom class, you can implement a custom -hash method. But for NSMutableDictionary, you can't. And, if you do implement a custom -hash method for your custom class which is insensitive to the "contents" (whatever that might be) of its instances, then that's a _very_ different equality semantic than NSDictionary provides.
> http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html
>
> "Internally, a dictionary uses a hash table to organize its storage and to provide rapid access to a value given the corresponding key. However, the methods defined in this cluster insulate you from the complexities of working with hash tables, hashing functions, or the hashed value of keys. The methods described below take keys directly, not their hashed form."
>
> So, you may use your own hash function to create your keys... or not, as you wish.
Um, the keys are not typically the output of a hash function. Well, you can use such for keys, but that's irrelevant to the hash of the dictionary object, itself.
> But then the NSDictionary and NSMutableDictionary will hash the keys you pass to their methods using their own, internal, hash function, to determine where objects are stored in the dictionary.
Right. So, if you mutate the dictionary while it's in the set, you will break things. That's why a set of mutable dictionaries (as opposed to immutable dictionaries, or some other data structure entirely) raises a huge red flag.
As I previously cited, from the documentation of -[NSObject hash]:
http://developer.apple.com/mac/library/documentation/cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html
"If a mutable object is added to a collection that uses hash values to determine the object’s position in the collection, the value returned by the hash method of the object must not change while the object is in the collection. Therefore, either the hash method must not rely on any of the object’s internal state information or you must make sure the object’s internal state information does not change while the object is in the collection. Thus, for example, a mutable dictionary can be put in a hash table but you must not change it while it is in there. (Note that it can be difficult to know whether or not a given object is in a collection.)"
Note that this case of mutable dictionaries in a collection is explicitly warned about.
> But my primary point was to ask the original poster to think about why he is using this arrangement of instances of NSMutableDictionary stored in an NSMutableSet.
Yes, and that was my point, too.
-Ken
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden