Because they are one and the same object. Instances of small NSNumbers are cached by their implementation, and now Objective-C actually uses tagging for NSNumbers in a specific range.
Similarly, [@"someString" copy]just return @"someString". As long as the semantics are preserved correctly, the structure can do all kinds of things like this under the hood.