В чем разница между NSNumber и NSInteger?
в чем разница между NSNumber и NSInteger? Есть ли еще такие примитивы, о которых я должен знать? Есть ли один для поплавков?
5 ответов:
существующие ответы полезны; добавление к ним:
да
NSUInteger
дает удвоенный диапазон среди положительных целых чисел какNSInteger
, но я думаю, что еще одна важная причина для выбора между ними-просто различать случаи где отрицательные значения просто не имеет смысла.пример: возвращаемое значение
NSArray
' scount
методNSUInteger
, который имеет смысл, так как мы не можем иметь массив с отрицательным числом из стихий. Когда кодер знает, что он не подписан, он/она имеет больше свободы для выполнения операций, которые могут быть ненадежными в подписанном случае, включая побитовые операции, такие как сдвиг. этот блог говорит больше о подписанном против неподписанного.мое предположение о
CGFloat
vsNSFloat
(который не существует): возможно, конструкторам элементов кода с именем NeXTStep просто не нужно было указывать слишком много значений float, за пределами временные отрезки. Так они далиNSTimeInterval
, который является типом с плавающей запятой, но который явно предназначен для использования с временными интервалами. И, честно говоря, это здорово иметь такой тип, потому что вы знаете, что он всегда должен быть в секундах без необходимости иметь дело со структурой. Когда вы перемещаетесь в графический мир (где живет основная графика), внезапно плавает все вокруг вас, паря в воздухе (ха-ха). Так что имеет смысл ввестиCGFloat
там. Этот абзац весь " образованный предположение."кроме того, просто чтобы быть ясным о почему вы могли бы использовать
NSInteger
etc вместо примитивных типов: потому что таким образом легче писать портативный код, который в полной мере использует архитектуру машины. Например,CGFloat
использует 32 бита на одних машинах и 64 бита на других, в зависимости в значительной степени от того, насколько разрыв в эффективности существует на этих машинах для этих размеров. В некоторых случаях нет реального ускорения для использования 32 бит против 64 бит, поэтому вы можно также использовать 64 бита. Если вы объявили вещи какCGFloat
's, вы вдруг получаете эту дополнительную точность "бесплатно" при перекомпиляции.и, как указал икендак,
NSNumber
это класс-оболочка для всех из них (и других примитивных или квази-примитивных типов, таких какBOOL
), который позволяет включить его в свойNSArray
s иNSDictionary
s, архивировать их легче, и делать другие вещи, которыеNSObject
S может сделать.
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.