objective-c cocoa types int nsinteger

objective c - ¿Cuál es la diferencia entre int y NSInteger?



objective-c cocoa (2)

¿Podemos usar int y NSInteger de forma intercambiable?

No. En la arquitectura LP64 utilizada por Apple, para el OS X Cocoa moderno, NSInteger tiene 64 bits de ancho. Esto significa que si transfiere un NSInteger a una int, las comparaciones con NSNotFound pueden fallar. Aquí hay 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, solo debe usar NSInteger donde necesite pasar un parámetro a Cocoa o recibir un resultado de Cocoa y la documentación dice que el tipo de datos es NSInteger . En todos los otros casos:

  • si no le interesa el ancho del tipo, use un tipo C, por ej. int o long .
  • si le interesa el ancho del tipo, use los tipos C99 stdint.h por ejemplo, int64_t , int64_t .
  • si necesita una int garantizada lo suficientemente grande como para contener un puntero, use intptr_t o uintptr_t

Posibles duplicados:
Cuándo usar NSInteger vs int?
¿Por qué hay un NSInteger?

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


Yo diría que use el estándar C99 uintptr_t para enteros de tamaño 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.

En cuanto a 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