2015-11-15 3 views
3

, если вы знаете, что определенное целое должно быть использовано как объект хотя бы в одной точке жизненного цикла, должно ли оно быть объявлено и использоваться как NSNumber с самого начала?Цель C - когда использовать NSNumber против примитива

Я знаю, что вычисления должны выполняться с использованием примитивных типов данных, и поэтому вы говорите [NSNumber numberWithInteger: myInt]. Но если 90% времени вам нужен только для базового типа данных, другие 10% оправдывают создание NSNumber и постоянно используют [NSNumber intValue] для извлечения вашего примитива? Имеются ли заметные преимущества в производительности для прилипания к примитиву как можно дольше или преимущества OO NSNumber превышают их?

Как новичок в Objective C, мне также интересно, что такое лучшая практика - от таких языков, как Ruby и PHP, где этого не происходит.

+0

Хм Я действительно спрашиваю про примитивный тип Int, а не NSInteger – djt

+0

@ChrisLoonam ах Теперь я вижу ответ на пару ниже принятого, у которого есть информация по моему вопросу. Благодаря! – djt

+0

Обычно используется 'NSInteger' (который является typedef для' long' или 'int'), если вы по какой-то причине явно не нуждаетесь в объекте. – Rob

ответ

3

NSNumber несколько редок в Objective-C. Конечно, не неслыханно, но несколько редок. Если вы сомневаетесь, вы хотите использовать NSInteger. Я написал целые, большие программы без одного NSNumber в них.

Наиболее часто используется для NSNumber, когда вы хотите, чтобы поместить его в NSArrayNSDictionary, или сериализовать его (например, в NSUserDefaults). В большинстве случаев цифры являются лишь свойством какого-либо другого объекта, как NSInteger.

+0

Я вижу. Полагаю, я не спрашиваю о NSNumber.Я прошу об использовании примитива (int) и объектной версии (NSNumber, NSInteger и т. Д.). – djt

+1

NSInteger не является объектом. Это просто псевдоним для int или long, в зависимости от вашей платформы. Обычно NSInteger вы хотите в Cocoa, потому что он соответствует ожиданиям фреймворков. NSNumber, с другой стороны, является объектом. Он используется только тогда, когда вам действительно нужен объект для этого номера. –

+0

А я вижу. Таким образом, по моему вопросу, если я знаю, что число в конечном итоге должно быть в NSArray в какой-то момент его жизненного цикла, имеет смысл объявить его NSNumber с самого начала? Или создать NSInteger и создать только NSNumber, когда мне нужно добавить указанное целое число в массив? – djt

0

В Objective-C вы можете сделать большую часть C, поэтому, конечно, если вам не нужно что-то делать с объектом, вы всегда можете использовать примитивные типы, пока не получите желаемый результат. Затем, если вы хотите вставить его в NSArray или показать в UILabel или что-то еще, переведите его в NSNumber.

NSInteger представляет собой комбинацию int/long из-за разных 32-битных/64-битных, другой примитивный тип типа float не имеет никаких проблем с этим, поэтому только специальный тип примитива OC NSInteger.

NSNumber и примитивный тип похожи на Integer vs int в Java, я думаю. Вам нужен примитивный тип для выполнения арифметики, а NSNumber - для работы над ситуацией и пространством памяти. Они не могут выполнять работу другой стороны.

2

В принципе, не используйте NSNumber, если вы на самом деле в настоящее время не нуждаетесь.

Если какой-либо API, который вы используете, ожидает NSNumber s, тогда сгенерируйте те NSNumber экземпляров по запросу. В принципе, используйте примитивы для вычислений, для хранения информации и даже в ваших API (например, свойства открытого класса) до тех пор, пока это возможно.

3

Мой совет - использовать примитивные типы, если значения не будут тратить много времени в коллекциях (NSArray, NSDictionary и т. Д.). Синтаксис @(myInt) довольно чист, для тех случаев вам нужен NSNumber.

Единственное исключение, о котором я бы помнил, - это когда вам нужно знать, было ли значение когда-либо инициализировано. В этом случае, если у вас нет четкого «неинициализированного» значения (например, ноль, NSNotFound, -1 и т. Д.), Использование NSNumber, установленного в nil, упрощает и детерминирует способ узнать, что у вас есть.

+0

Спасибо за информацию и хороший вызов короткого синтаксиса '@ (myInt)'! – djt

Смежные вопросы