I have created 2 objects:
NSNumber * index1 = [[[NSNumber alloc] initWithInt:0 autorelease];
NSNumber * index2 = [[[NSNumber alloc] initWithInt:0 autorelease];
and put a breackpoint after the allocation, but INCREDIBLY i see the same address for the two objects:

and [index1 isEqual: index2] return always TRUE
??? why?
It’s an internal optimisation. NSNumbers are immutable, so, to save space, if you ask for an NSNumber representation of 0 (and some other small constants) you always get back the same object.