Cuándo usar NSInteger frente a int

Resuelto Shizam asked hace 54 años • 8 respuestas

¿ Cuándo debería utilizar NSIntegervs. 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 intpara rastrear un valor

for (int i; i < something; i++)
...

int something;
something += somethingElseThatsAnInt;
...

He leído (me han dicho) que NSIntegeres una forma segura de hacer referencia a un número entero en un entorno de 64 o 32 bits, entonces, ¿por qué usarlo int?

Shizam avatar Jan 01 '70 08:01 Shizam
Aceptado

Por lo general, desea utilizarlo NSIntegercuando 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 NSIntegeren lugar de int/ longa menos que los requiera específicamente.

NSInteger/ NSUIntegerse 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.

Jacob Relkin avatar Dec 14 '2010 23:12 Jacob Relkin

¿Por qué usarlo int?

Apple lo usa intporque para una variable de control de bucle (que solo se usa para controlar las iteraciones del bucle) intel 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 intservirá la mayor parte del tiempo.

Apple usa NSIntegerpara 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.

Only You avatar Mar 16 '2011 02:03 Only You

OS X es "LP64". Esto significa que:

intsiempre es de 32 bits.

long longsiempre es de 64 bits.

NSIntegery longsiempre 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 inten lugar de longcontener variables del tamaño de un puntero, lo que significaba que las API tenían que cambiar de inta longen 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. NSIntegertiene la intención de enmascarar este problema con estas API heredadas.

En su nuevo código, utilícelo intsi necesita una variable de 32 bits, long longsi necesita un entero de 64 bits o longsi NSIntegernecesita una variable del tamaño de un puntero.

Darren avatar Dec 14 '2010 23:12 Darren