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


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

5 60

5 ответов:

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

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

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

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

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

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

NSNumber является классом, а не примитивом, и используется, когда вам нужно поместить необработанные числа в словари, массивы или иным образом инкапсулировать их. NSInteger,NSUInteger,CGFloat, etc-это простые типы и соответствуют (на 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 и т. д. что все они являются синонимами для примитивных типов.

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.