Да, это утечка. Вы хотите:
NSNumber *temp_number = [[NSNumber alloc] initWithInteger:someNSInteger];
[target_array addObject:temp_number];
[temp_number release];
Итак, нет copy
. Логика в том, что, поскольку вы используете alloc, вы в конечном итоге владеете temp_number. Затем вы добавляете его в массив, и массив делает все, что ему нужно. Вы использовали temp_number по прямому назначению, поэтому вы больше не хотите владеть им и выпускать его.
Если вы возьмете копию, это создаст другой экземпляр NSNumber, которым вы также владеете, и, следовательно, который вы также должны выпустить, когда закончите.
На практике массив (если он выделен и существует, а не равен нулю), сохранит объект для себя, но это деталь реализации, специфичная для этого класса, а не то, от чего вы должны зависеть или даже особенно интересоваться помимо контракта, который говорит, что объекты, которые вы добавляете, позже могут быть найдены в массиве.