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