Я думаю, что NSNumber имеет специальную реализацию, точно так же, как NSString.
[NSNumber alloc] фактически не выделяет память, а скорее возвращает универсальный указатель.Распределение будет обрабатываться одним из методов init, но и здесь initWithInt: 5 - такая распространенная ситуация, что вместо создания нового объекта возвращается указатель на объект по умолчанию.И этот не может быть освобожден в любом случае.
// do it once
NSNumber* five1 = [NSNumber alloc];
NSLog(@"%p", five1);
five1 = [five1 initWithInt:5];
NSLog(@"%p", five1);
// and once more
NSNumber* five2 = [NSNumber alloc];
NSLog(@"%p", five2);
five2 = [five2 initWithInt:5];
NSLog(@"%p", five2);
На самом деле, не должно быть проблем с отправкой сообщения о выпуске более одного раза:
[five1 release];
[five1 release];
[five1 release];