2010-06-13 28 views
22

Tengo una línea de código que funcionará de manera diferente según los tipos de datos "día" y "1". Creo que es lo siguiente aunque verifique mi código fuente más tarde.int vs NSNumber vs NSInteger

day = day + 1;

¿Tiene esto sentido? ¿Cuáles serían las diferencias?

Respuesta

42

NSInteger es una definición de tipo que describe un entero, pero NO es equivalente a int en plataformas de 64 bits.
Puede examinar typedef haciendo clic con el botón cmd en NSInteger en Xcode.
NSInteger se define como int al compilar una aplicación de 32 bits y como long para aplicaciones de 64 bits.
La mayoría de las veces puede reemplazar int con NSInteger, pero hay algunas cosas que debe considerar al hacerlo.
Apple's 64-Bit Transition Guide for Cocoa tiene algo de información al respecto.

NSNumber es una clase que te ayuda a almacenar tipos numéricos como objeto. Tiene métodos para convertir entre diferentes tipos y métodos para recuperar una representación de cadena de su valor numérico.
Si usa una variable day del tipo NSNumber* de la manera en que lo hizo en su ejemplo, no está modificando el valor de day sino su dirección de memoria.

Si está trabajando con valores de tiempo también puede echar un vistazo a NSDate.

+1

Interesante ... parece ser un punto importante ... – Moshe

2

1 es un literal y el compilador lo convertirá en el tipo numérico apropiado si es apropiado.

Nótese, sin embargo, que si bien son NSInteger y int a la mayoría de los efectos la misma cosa, NSNumber es un tipo de objeto. Para ese caso, su código no tiene sentido (y no debería compilarse sin advertencias).

(En realidad, hay algunas circunstancias en las que sería una especie de sentido, en cuanto a la aritmética de punteros, pero eso no es totalmente lo que quiere.)

Para el caso NSNumber, tendría lugar quiere algo como:

day = [NSNumber numberWithInt:[day intValue] + 1]; 
2

NSInteger y int son equivalentes, NSNumber es un objeto utilizado para almacenar tipos de números primitivos (int, largo, de flotador, etc.).

El código de ejemplo que ha publicado funcionará muy bien si day es , no funcionará si es NSNumber.

+2

NSInteger e int no son equivalentes para aplicaciones de 64 bits. (NSInteger se define como largo para aplicaciones de 64 bits). El código de ejemplo publicado también funcionará si day es una instancia de NSNumber pero el incremento no cambiará el valor sino la dirección del receptor. Es muy probable que esto no sea lo que quiere el OP. –

+0

Para NSObject, el compilador no le permitirá hacer aritmética de puntero. – gnasher729

8

NSInteger es un simplemente un número entero, NSNumber es un objeto donde como int es un tipo de datos primitivo.

NSInteger no es más que un sinónimo de un entero largo.

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

se puede envolver un NSInteger en un NSNumber usando:

NSNumber *NumberToStore = @(21); 

y obtener de nuevo usando:

NSInteger retrievingInteger = [NumberToStore integerValue]; 
+0

NSnúmero si necesita almacenar un número _ como objeto_. Por ejemplo, en un NSDictionary o un NSArray o un NSSet. – gnasher729