Pregunta

NSInteger/NSUInteger son reemplazos definidos por Cocoa para los tipos integrados regulares.

¿Hay algún beneficio al usar los tipos NS* sobre los integrados?cuál prefieres y por qué?Son NSInteger y int ¿El mismo ancho en plataformas de 32 bits/64 bits?

¿Fue útil?

Solución

Según tengo entendido, NSInteger et al.son versiones seguras de arquitectura de los tipos C correspondientes.Básicamente, su tamaño varía según la arquitectura, pero se garantiza que NSInteger, por ejemplo, mantendrá cualquier puntero válido para la arquitectura actual.

Apple recomienda que los use para trabajar con OS X 10.5 y posteriores, y las API de Apple los usarán, por lo que definitivamente es una buena idea adquirir el hábito de usarlos.Requieren escribir un poco más, pero aparte de eso no parece haber ninguna razón para no usarlos.

Otros consejos

Problemas de cuantificación para el tiempo de ejecución de 64 bits

En algunas situaciones puede haber buenas razones para utilizar tipos estándar en lugar de NSInteger:Aumento de memoria "inesperado" en un sistema de 64 bits.

Claramente, si un número entero es 8 en lugar de 4 bytes, la cantidad de memoria que ocupan los valores se duplica.Sin embargo, dado que no todos los valores son números enteros, normalmente no debería esperar que se duplique el uso de memoria de su aplicación.Sin embargo, la forma en que Mac OS X asigna la memoria cambia según la cantidad de memoria solicitada.

Actualmente, si solicita 512 bytes o menos, malloc redondea al siguiente múltiplo de 16 bytes.Sin embargo, si solicita más de 512 bytes, malloc redondea al siguiente múltiplo de 512 (al menos 1024 bytes).Supongamos entonces que define una clase que, entre otras, declara cinco NSInteger variables de instancia, y que en un sistema de 32 bits cada instancia ocupa, digamos, 272 bytes.En un sistema de 64 bits, las instancias requerirían, en teoría, 544 bytes.Pero, debido a la estrategia de asignación de memoria, cada uno ocupará en realidad 1024 bytes (un aumento de casi cuatro veces).Si utiliza una gran cantidad de estos objetos, el uso de memoria de su aplicación puede ser considerablemente mayor de lo que cabría esperar.Si reemplazaste el NSInteger variables con sint_32 variables, solo usaría 512 bytes.

Por lo tanto, cuando elija qué escalar usar, asegúrese de elegir algo sensato.¿Hay alguna razón por la que necesita un valor mayor al que necesitaba en su aplicación de 32 bits?Es poco probable que sea necesario utilizar un número entero de 64 bits para contar una cantidad de segundos...

64 bits es en realidad la razón de ser de NSInteger y NSUInteger;antes del 10.5, esos no existían.Los dos se definen simplemente como longs en 64 bits y como ints en 32 bits:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Por lo tanto, utilícelos en lugar de los tipos C más básicos cuando desee el tamaño "nativo de bits".

CocoaDev tiene más información.

Prefiero las declaraciones de estilo estándar de C, pero sólo porque cambio entre varios idiomas y no tengo que pensar demasiado en ello, pero parece que debería empezar a buscar en nsinteger.

Para importar y exportar datos a archivos o a través de la red utilizo UInt32, SInt64 etc...

Se garantiza que serán de cierto tamaño independientemente de la arquitectura y ayudarán a portar el código a otras plataformas y lenguajes que también comparten esos tipos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top