В чем разница между NSNumber и NSInteger?

в чем разница между NSNumber и NSInteger? Есть ли еще такие примитивы, о которых я должен знать? Есть ли один для поплавков?

5 ответов


существующие ответы полезны; добавление к ним:

да NSUInteger дает дважды диапазон среди положительных целых чисел как NSInteger, но я думаю, что еще одна критическая причина выбирать между ними-просто различать случаи где отрицательные значения просто не имеет смысла.

пример: возвращаемое значение NSArray ' s count метод NSUInteger, который имеет смысл, так как мы не можем иметь массив с отрицательным числом стихий. Когда кодер знает, что он неподписан, он/она имеет больше свободы для выполнения операций, которые могут быть ненадежными в подписанном случае, включая побитовые операции, такие как сдвиг. этот блог подробнее о подписанном vs без подписи.

мое предположение о CGFloat vs NSFloat (которого не существует): возможно, конструкторам элементов кода с именем NeXTStep просто не нужно было указывать слишком много значений float, за пределами временные отрезки. Так они дали NSTimeInterval, который является типом с плавающей запятой, но который явно предназначен для использования с временными интервалами. И, честно говоря, это здорово иметь такой тип, потому что вы знаете, что он всегда должен быть в секундах без необходимости иметь дело со структурой. Когда вы переходите в графический мир (где живет Core Graphics), внезапно вокруг вас появляются поплавки, парящие в воздухе (ха-ха). Поэтому имеет смысл ввести CGFloat там. Этот абзац весь " образованный предположение."

кроме того, просто чтобы быть ясным о почему вы могли бы использовать NSInteger etc вместо примитивных типов: потому что таким образом легче писать портативный код, который в полной мере использует архитектуру машины. Например,CGFloat использует 32 бита на некоторых машинах и 64 бита на других, в зависимости в основном от того, сколько разрыва в эффективности на этих машинах для этих размеров. В некоторых случаях нет реального ускорения для использования 32 бит против 64 бит, поэтому вы можно также использовать 64 бита. Если вы объявили вещи как CGFloat, вы внезапно получаете эту дополнительную точность "бесплатно" при перекомпиляции.

и, как указал икендак,NSNumber является классом-оболочкой для всех из этих (и других примитивных или квази-примитивных типов, таких как BOOL), который позволяет включить его в свой NSArrays и NSDictionarys, архивировать их легче, и делать другие вещи, которые NSObjectS может сделать.


NSNumber - это класс, а не примитив, и используется, когда вам нужно поместить необработанные числа в словари, массивы или иным образом инкапсулировать их. NSInteger, NSUInteger, CGFloat и т. д. являются простыми типами и соответствуют (на 32-bt системах, таких как iPhone)int, unsigned int и float.

как правило, если вам нужно хранить номер где-то, используйте NSNumber. Если вы делаете вычисления, циклы и т. д., Используйте NSInteger, NSUInteger или CGFloat.

вы можете обернуть NSInteger на NSNumber:

NSNumber *aNumber = [NSNumber numberWithInteger:21];

... и получить его обратно:

NSInteger anInteger = [aNumber integerValue];

вы можете узнать больше информации здесь:http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html


NSInteger так же, как традиционный int В С. Это определение типа. Есть и другие, подобные NSUInteger, CGFloat, etc. что все они являются синонимами примитивных типов.

NSNumber полезен, когда вам нужно вставить число в NSArray или NSDictionary. Стандартная практика заключается в использовании этих коллекций против сворачивания собственных; недостатком является то, что они могут содержать только объекты Objective-C.

NSNumber, по сути, заключающей int (или float и т. д.) В Obj-C объект (похожий на концепцию "бокса" примитивного типа C#/Java), который можно добавить в массив:

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

по соображениям производительности, если можно, используйте примитивные типы (например, int, float, int[]). Однако иногда вы не можете избежать NSArray / NSNumber, например, когда вы читаете или записываете записи в .


NSNumber обычно используется для хранения переменных, NSUInteger используется для арифметики

вы можете изменить NSNumber на NSUInteger, выполнив следующее:

NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];

Это было сказано ранее, но как общее эмпирическое правило, переменные, которые должны быть определены с помощью*, являются объективными классами C, тогда как переменные, которые не нуждаются в A*, являются примитивами C.


как уже говорили другие,NSNumber это NSObject подкласс. Это не примитив C (как int, unsigned int, float, double и т. д.) NSInteger, CGFloat, NSUInteger простые typedefs на C первообразных.

необходимость NSNumber возникает из-за необходимости использовать числа в качестве параметров в API, которые требуют объекты. Например, когда вы хотите сохранить номер в NSArray, в Core-Data, или в NSDictionary.

есть ли больше примитивов, таких как это то, о чем я должен знать? Ну,NSNumber не является примитивным типом, и он охватывает все виды чисел (поплавки, интегральные типы, булевы и так далее). Вы также должны узнать о NSValue, который является базой для NSNumber.

есть ли один для поплавков? Нет" NS " typedef для float, но NSNumber смогите обернуть вокруг любого номера поплавка:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

или вы можете использовать примитивный тип CGFloat CoreGraphics.