2011-05-19 18 views
14

duplicados posibles:
When to use NSInteger vs int?
Why is there is an NSInteger?¿Cuál es la diferencia entre int y NSInteger?

podemos utilizar int y NSInteger indistintamente? ¿Hay alguna situación específica para usar NSInteger solamente, en lugar de usar int?

+2

duplicado posible de [Al utilizar NSInteger vs int?] (Http://stackoverflow.com/questions/4445173/when-to-use-nsinteger-vs-int), [Cómo convertir a NSInteger int] (http://stackoverflow.com/questions/1752701/), o [¿Por qué hay un NSInteger] (http://stackoverflow.com/questions/5870867/), solo tres [entre muchos] (http://stackoverflow.com/search?q=nsinteger+int). –

Respuesta

19

¿Podemos usar int y NSInteger de manera intercambiable?

No. En la arquitectura LP64 utilizada por Apple, para OS X Cocoa moderno, NSInteger tiene 64 bits de ancho. Esto significa que si transfiere un NSInteger a un int, las comparaciones contra NSNotFound pueden fallar. He aquí un ejemplo:

NSRange theRange = [@"foo" rangeOfString @"x"]; 
int location = theRange.location; 
if (location == NSNotFound) // comparison is broken due to truncation in line above 
{ 
    // x not in foo 
} 

En mi opinión, sólo se debe utilizar NSInteger donde tiene que pasar un parámetro de cacao o recibir el resultado del Cacao y la documentación dice que el tipo de datos es NSInteger. En todos los demás casos:

  • si no le interesa el ancho del tipo, utilice un tipo C, p. int o long.
  • si le interesa el ancho del tipo, utilice los tipos C99 stdint.h, p. int32_t, int64_t.
  • si necesita un int garantizado suficientemente grande para contener un puntero, utilice intptr_t o uintptr_t
+0

Además, si necesita la diferencia entre dos punteros, debe usar 'ptrdiff_t', mientras que para el tamaño de un objeto en la memoria,' size_t' es apropiado. Y para las compensaciones en los archivos en el disco, 'off_t'. Todo esto es C básico, realmente. – alastair

+0

@alastair: completamente de acuerdo – JeremyP

2

yo diría uintptr_t uso estándar C99 para enteros de tamaño de puntero. La definición de NSInteger parece suficientemente turbia para que no se pueda garantizar que tenga un puntero.

Use NSInteger donde la API lo usa, si es necesario. Pero mucho tiempo servirá para todos los propósitos prácticos.

Al mirar NSObjCRunTime, realmente no entiendo la motivación para su definición actual. ¿Probablemente tener un tipo entero lo suficientemente grande como para ir, por ejemplo, a la cantidad máxima de elementos en un NSArray?

#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 
+1

No, use 'uintptr_t' o' intptr_t' para enteros de tamaño puntero. – alastair

+0

Gracias, soy demasiado C++ - 98 (y mal, en este caso). Respuesta ajustada. –

Cuestiones relacionadas