Cuándo usar NSInteger frente a int
¿ Cuándo debería utilizar NSInteger
vs. int al desarrollar para iOS? Veo en el código de muestra de Apple que usan NSInteger
(o NSUInteger
) cuando pasan un valor como argumento a una función o devuelven un valor de una función.
- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...
Pero dentro de una función que solo usan int
para rastrear un valor
for (int i; i < something; i++)
...
int something;
something += somethingElseThatsAnInt;
...
He leído (me han dicho) que NSInteger
es una forma segura de hacer referencia a un número entero en un entorno de 64 o 32 bits, entonces, ¿por qué usarlo int
?
Por lo general, desea utilizarlo NSInteger
cuando no sabe en qué tipo de arquitectura de procesador se puede ejecutar su código, por lo que, por alguna razón, es posible que desee utilizar el tipo de entero más grande posible, que en sistemas de 32 bits es solo un int
, mientras que en uno de 64 bits. sistema es un long
.
Seguiría usando NSInteger
en lugar de int
/ long
a menos que los requiera específicamente.
NSInteger
/ NSUInteger
se definen como *dinámicos typedef
* para uno de estos tipos, y se definen así:
#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
Con respecto al especificador de formato correcto que debe utilizar para cada uno de estos tipos, consulte la sección Dependencias de plataforma de la Guía de programación de cadenas.
¿Por qué usarlo int
?
Apple lo usa int
porque para una variable de control de bucle (que solo se usa para controlar las iteraciones del bucle) int
el tipo de datos está bien, tanto en el tamaño del tipo de datos como en los valores que puede contener para su bucle. Aquí no es necesario un tipo de datos que dependa de la plataforma. Para una variable de control de bucle, incluso una de 16 bits int
servirá la mayor parte del tiempo.
Apple usa NSInteger
para un valor de retorno de función o para un argumento de función porque en este caso el tipo de datos [tamaño] importa , porque lo que estás haciendo con una función es comunicar/pasar datos con otros programas o con otras piezas de código; vea la respuesta a ¿ Cuándo debería usar NSInteger vs int? en tu pregunta misma...
ellos [Apple] usan NSInteger (o NSUInteger) cuando pasan un valor como argumento a una función o devuelven un valor de una función.
OS X es "LP64". Esto significa que:
int
siempre es de 32 bits.
long long
siempre es de 64 bits.
NSInteger
y long
siempre tienen el tamaño de un puntero. Eso significa que son de 32 bits en sistemas de 32 bits y de 64 bits en sistemas de 64 bits.
La razón por la que NSInteger existe es porque muchas API heredadas se usaban incorrectamente int
en lugar de long
contener variables del tamaño de un puntero, lo que significaba que las API tenían que cambiar de int
a long
en sus versiones de 64 bits. En otras palabras, una API tendría diferentes firmas de funciones dependiendo de si está compilando para arquitecturas de 32 o 64 bits. NSInteger
tiene la intención de enmascarar este problema con estas API heredadas.
En su nuevo código, utilícelo int
si necesita una variable de 32 bits, long long
si necesita un entero de 64 bits o long
si NSInteger
necesita una variable del tamaño de un puntero.