iphone objective-c nsnumber primitive-types nsinteger

iphone - ¿Cuál es la diferencia entre NSNumber y NSInteger?



objective-c primitive-types (5)

Como dijeron otros antes, NSNumber es una subclase de NSObject . No es una primitiva C ( como int, unsigned int, float, double, etc. ) NSInteger , CGFloat , NSUInteger son simples typedefs sobre las primitivas C.

La necesidad de NSNumber surge de la necesidad de utilizar números como parámetros para las API que requieren Objetos. Ejemplo es cuando desea almacenar un número en un NSArray , en Core-Data o en un NSDictionary .

¿Hay más primitivos como estos que deba conocer? Bueno, NSNumber no es un tipo primitivo, y envuelve todo tipo de números (flotantes, tipos integrales, booleanos, etc.). También debe aprender acerca de NSValue, que es la base para NSNumber .

¿Hay uno para carrozas? No hay NSNumber "NS" para flotación, pero NSNumber puede rodear cualquier número de flotación:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

O puede usar el tipo primitivo CoreGraphics CGFloat.

¿Cuál es la diferencia entre NSNumber y NSInteger? ¿Hay más primitivos como estos que deba conocer? ¿Hay uno para carrozas?


Las respuestas existentes son útiles; añadiéndoles:

Sí, NSUInteger da el doble de rango entre enteros positivos que NSInteger , pero creo que otra razón crítica para elegir entre los dos es simplemente distinguir entre los casos en los que los valores negativos simplemente no tienen sentido .

Ejemplo: el valor de retorno del método de count de NSArray es un NSUInteger , lo cual tiene sentido ya que no podemos tener una matriz con un número negativo de elementos. Cuando el programador sabe que no está firmado, tiene más libertad para realizar operaciones que podrían no ser confiables en el caso firmado, incluidas las operaciones en modo bit, como el cambio. Esta publicación de blog habla más sobre firmado vs sin firmar.

Mi suposición acerca de CGFloat vs NSFloat (que no existe): Puede ser que los diseñadores de los elementos de código con nombre NeXTStep simplemente no necesiten especificar demasiados valores flotantes, fuera de intervalos de tiempo. Así que dieron NSTimeInterval , que es un tipo de coma flotante, pero que está claramente destinado a ser utilizado con intervalos de tiempo. Y, francamente, es genial tener ese tipo porque sabes que siempre debe estar en segundos sin tener que lidiar con una estructura. Cuando te mueves al mundo de los gráficos (donde vive Core Graphics), de repente flotan a tu alrededor, flotando en el aire (jaja). Entonces tiene sentido presentar un CGFloat allí. Este párrafo es todo "especulación educada".

Además, solo para aclarar por qué podría usar NSInteger etc., en lugar de tipos primitivos : porque de esta manera es más fácil escribir código portátil que aproveche al máximo la arquitectura de la máquina. Por ejemplo, un CGFloat usa 32 bits en algunas máquinas y 64 bits en otras, dependiendo en gran medida de la brecha de eficiencia que exista en esas máquinas para esos tamaños. En algunos casos, no hay una aceleración real para usar 32 bits frente a 64 bits, por lo que también podría usar 64 bits. Si has declarado cosas como CGFloat , de repente obtienes esa precisión extra "gratis" cuando vuelvas a compilar.

Y, como ha señalado NSNumber , NSNumber es una clase contenedora para todos estos (y otros tipos primitivos o casi primitivos como BOOL ) que le permite incluirlo en sus NSArray y NSDictionary , archivarlos más fácilmente y hacer otras cosas que NSObject s puede hacer.


NSInteger es como una int tradicional en C. Es un typedef. Hay otros como NSUInteger , CGFloat , etc. que son sinónimos de tipos primitivos.

NSNumber es útil cuando necesita insertar un número en un NSArray o NSDictionary. La práctica estándar es usar estas colecciones en comparación con las suyas propias; el inconveniente es que solo pueden contener objetos Objective-C.

NSNumber esencialmente envuelve un int (o float, etc.) en un objeto Obj-C (similar al concepto de ''boxeo'' de C # / Java, un tipo primitivo) que se puede agregar a una matriz:

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

Por razones de rendimiento, si puede, use tipos primitivos (como int, float, int []). Sin embargo, a veces no puede evitar NSArray / NSNumber, como cuando está leyendo o escribiendo entradas en un archivo .plist .


NSNumber generalmente se usa para almacenar variables, NSUInteger se usa para aritmética

usted puede cambiar un NSNumber a un NSUInteger haciendo esto:

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

Se ha dicho anteriormente, pero como regla general, las variables que deben definirse con * son clases Objetivo C, mientras que las variables que no necesitan a * son C primitivas.


NSNumber es una clase, no una primitiva, y se usa cuando necesita poner números en bruto en diccionarios, matrices o encapsularlos de otra manera. NSInteger , NSUInteger , CGFloat , etc. son tipos simples y corresponden (en sistemas de 32 bits como el iPhone) a int , unsigned int y float .

Como regla general, si necesita almacenar un número en alguna parte, use NSNumber . Si está haciendo cálculos, bucles, etc., use NSInteger , NSUInteger o CGFloat .

Puede envolver un NSInteger en un NSNumber :

NSNumber *aNumber = [NSNumber numberWithInteger:21];

... y recuperarlo:

NSInteger anInteger = [aNumber integerValue];

Puede encontrar más información aquí: http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html