On Feb 23, 2014, at 4:08 AM, [email protected] wrote:
>> 1(int) and 1(float) can be represented by the same NSNumber object perfectly 
>> legally.
> Is that true?

Yes.  As far as NSNumber is concerned, they are equal.  They are also both 
equal to @(YES) which is initialized with a BOOL.  Once a value is in an 
NSNumber, it looses its original type identity, and is simply a number.  You 
can get back any representation you like using the value methods.  -getValue 
allows you to get it back into a scalar, but not necessarily the same type you 
started with.  

I was writing a math program a while back and ran into this exact gotcha. I 
really wanted an -isFloat method, but it seemed to randomly store some floats 
as ints. That was before tagged pointers though, so the implementation may have 
changed (and may change again).

I wouldn’t rely on any undocumented implementation differences. Down that path, 
madness lies…

If you needed to store the creation method, you could write a wrapper around 
NSNumber (A subclass also works if you really need to pass it somewhere as an 
NSNumber, but there are gotchas as it is a class cluster).  Basically write a 
class ‘MyNumber’ which stores a NSNumber as it’s instance variable, and then 
forwards all of it’s methods to it.  You can store the type info in that class 
as it is created. You can also override -isEqual: to have the behavior you want 
(1 != 1f).

Thanks,
Jon
_______________________________________________

Cocoa-dev mailing list ([email protected])

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

This email sent to [email protected]

Reply via email to