Creating the NSNumber objects using unsignedLongLong instead of longLong solved 
my problem.  Thanks to everyone who participated in the lively discussion.

Sorry for being a little slow in closing the loop.

-Michael

On Feb 21, 2011, at 9:50 PM, Wim Lewis wrote:

> 
> On 19 Feb 2011, at 2:17 PM, Michael Crawford wrote:
>> Anyone have previous experience with this problem?  Can you shed some light 
>> on where my thinking and assumptions are wrong.  I could write a sweet of 
>> tests to try and prove/disprove what I think is happening but I'm hoping to 
>> benefit from someone else's pre-existing research, experiments, or internal 
>> knowledge.
> 
> One thing to check is to find two NSNumbers which you think should be equal, 
> and see whether they return YES to -isEqual:. This is the form of equality 
> which NSSet is interested in. (-hash is an optimization.)
> 
>> I also assumed that whether or not the value is signed or unsigned; negative 
>> or positive makes no difference as long as calling the same accessor method 
>> on both NSNumber instances returns the same result.
> 
> I think this is the false assumption that is giving you grief. Calling an 
> accessor whose return type can't represent the NSNumber's value will return a 
> value which has been converted according to C's casting rules (as far as I 
> know). Consider two large numbers whose bottom 16 bits are the same; calling 
> -unsignedShortValue on them will return the same value, but you wouldn't 
> expect (or want) those numbers to compare equal.
> 
> It looks like the contents of your noPlaySongs array were created using 
> numberWithLongLong:. Is there a reason not to use numberWithUnsignedLongLong: 
> to create them (as Greg Guerin suggests)? Or, ideally, never convert them to 
> a C integer representation in the first place and treat them as if they were 
> opaque objects (as Matt Neuburg suggests)? There's a fundamental difficulty, 
> which is that there is no C type which can represent the values of all 
> possible NSNumbers of integral types, (or even all C integers!), so 
> roundtripping the number through a plain integer type is fraught with peril 
> unless you know (or can figure out) which C type to use.
> 
> 
> (IIRC, there are still a few small warts in NSNumber/CFNumber's behavior 
> which come from the fact that the numeric types implemented by CFNumber are 
> not compatible with the numeric types implemented by NSNumber, and yet 
> NSNumber is toll-free-bridged to CFNumber. I don't think this is related to 
> your problem, though.)
> 
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to