Here's what NSObject isEqual: dictates about the relationship between -hash and -isEqual:
If two objects are equal, they must have the same hash value. This last point is particularly important if you define isEqual: in a subclass and intend to put instances of that subclass into a collection. Make sure you also define hash in your subclass.
That's the meat and potatoes right there. And this is what happens on 10.4.5.
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool;
NSNumber *a;
NSNumber *b;
pool = [NSAutoreleasePool new];
a = [NSNumber numberWithInt:1];
b = [NSNumber numberWithBool:YES];
NSLog( @"a=%@ (@%p hash=$%X), b=%@ (@%p hash=$%X), [a isEqual:b] == %s",
a, a, [a hash],
b, b, [b hash],
[a isEqual:b] ? "YES" : "NO");
[pool release];
return( 0);
}
2006-05-05 12:22:42.800 NSCFBooleanClusterFuck[1673] a=1 (@0x303280 hash=$1), b=1 (@0xa073a95c hash=$A073A95C), [a isEqual:b] == YESNSCFBoolean chooses to inherit the hash from NSObject.
As my customer is running 10.4.6 and noticed the problem, I am pretty sure the same problem is alive and well today.