Pregunta

¿Cuál es la diferencia entre NSNumber y NSInteger? ¿Hay más primitivas como estos que yo debería saber? ¿Hay uno para los flotadores?

¿Fue útil?

Solución

Las respuestas existentes son útiles; añadiendo a ellos:

Sí, NSUInteger da el doble de alcance entre los números enteros positivos como NSInteger, pero creo que otra de las razones fundamentales para elegir entre los dos es simplemente para distinguir entre los casos donde los valores negativos simplemente no tienen sentido .

Ejemplo: el valor de retorno del método de NSArray de count es un NSUInteger, lo cual tiene sentido ya que no podemos tener una matriz con un número negativo de elementos. Cuando el codificador sabe que es sin firmar, él / ella tiene más libertad para realizar operaciones que podrían ser poco fiables en el caso firmado, incluyendo operaciones bit a bit, tales como el cambio. este blog post habla más sobre firmó vs sin firmar.

Mi suposición acerca de CGFloat vs NSFloat (que no existe): Podría ser el caso de que los diseñadores de los elementos de código con nombres NeXTStep simplemente no necesitan especificar demasiados valores flotantes , fuera de los intervalos de tiempo. Por lo que dieron NSTimeInterval, que es un tipo de punto flotante, pero que tiene la clara intención para su uso con intervalos de tiempo. Y, francamente, es muy bueno tener ese tipo porque sabes que siempre está destinado a ser en cuestión de segundos sin tener que hacer frente a una estructura. Cuando se mueve en el mundo de los gráficos (donde vive núcleo de gráficos), de repente flotadores están a su alrededor, flotando en el aire (jaja). Así que tiene sentido para introducir un CGFloat allí. Este párrafo es todo "especulación educada."

Además, para ser claros acerca de por las que podría utilizar NSInteger etc en lugar de tipos primitivos : Porque de esta manera es más fácil escribir código portátil que aprovecha al máximo la arquitectura de la máquina. Por ejemplo, un CGFloat utiliza 32 bits en algunas máquinas y 64 bits en otros, dependiendo en gran medida de la cantidad de un desnivel de eficiencia hay en esas máquinas para esos tamaños. En algunos casos, no hay aumento de velocidad real para el uso de 32 bits vs 64 bits, por lo que bien podría utilizar 64 bits. Si usted ha declarado en cosas como de CGFloat, de repente tener que precisión adicional "gratis" cuando vuelva a compilar.

Y, como iKenndac ha señalado, NSNumber es una clase contenedora para todos de estos (y otros tipos primitivos o cuasi-primitivos como el BOOL) que le permite incluirlo en sus NSArrays y NSDictionarys, archivarlos con mayor facilidad, y hacer otras cosas que pueden hacer NSObjects.

Otros consejos

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

Como regla general, si necesita almacenar un número en algún lugar, utilizar NSNumber. Si estás haciendo cálculos, bucles, etc., el uso 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

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

NSNumber es útil cuando se necesita para pegar un número en un NSArray o NSDictionary. La práctica habitual es utilizar estas colecciones frente a rodar su propia; el inconveniente es que sólo pueden contener objetos Objective-C.

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

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

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

NSNumber se utiliza generalmente para almacenar variables, NSUInteger se utiliza para la aritmética

se puede cambiar un NSNumber a un NSUInteger al hacer esto:

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

Se ha dicho antes, pero como regla general, las variables que necesitan ser definidos con * son clases de Objective C, mientras que las variables que no necesitan un * son C primitivas.

Según lo dicho por otros antes, NSNumber es una subclase NSObject. No es un C primitiva ( 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 usar los números como parámetros a las API que requieren objetos. El ejemplo es, cuando se desea almacenar un número en un NSArray, En los datos básicos, o en un NSDictionary.

¿Hay más primitivas como estos que yo debería saber? Bueno, NSNumber no es un tipo primitivo, y se envuelve alrededor de todo tipo de números (flotadores, tipos enteros, booleanos y así sucesivamente). También debe aprender sobre NSValue, que es la base para NSNumber.

¿Hay uno para los flotadores? No hay ninguna typedef "NS" de flotador, pero NSNumber puede envolver alrededor de cualquier número de flotación:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

O usted podría utilizar los CoreGraphics tipo primitivo CGFloat.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top