core-data nsuinteger

core data - ¿Qué NSNumber(Entero 16, 32, 64) en los datos básicos debería utilizar para mantener NSUInteger



core-data (2)

¿ Realmente necesitas todo el rango de un NSUInteger ? En iOS, que es un valor sin signo de 32 bits, que puede ser muy grande. Encontrará en un 64 bit firmado.

Pero probablemente no necesites tanta precisión de todos modos. El máximo para un uint32_t es UINT32_MAX que es 4,294,967,295 (4 mil millones). Si aumenta una vez por segundo, le tomará más de 136 años alcanzar ese valor. El iPhone de tu usuario no estará disponible para entonces ... :)

Quiero mantener NSUInteger en mis datos centrales y no sé qué tipo debo usar (número entero 16, 32, 64) para adecuarme al espacio necesario.

De mi entendimiento

Integer 16 can have minimum value of -32,768 to 32,767 Integer 32 can have minimum value of -2,147,483,648 to 2,147,483,647 Integer 64 can have minimum value of -very large to very large

y NSUInteger es tipo def de unsiged long igual a unsigned int ( Tipos en objetivo-c en iPhone )

Entonces, si convierto mi NSUInteger a NSNumber con numberWithUnsignedInteger: y lo guardo como NSNumber (Integer 32), puedo recuperar mis datos de forma segura ¿no?


Si es posible, al escribir datos en el disco o en una red, es mejor ser explícito sobre el tamaño del valor. En lugar de usar NSUInteger como el tipo de datos, use uint16_t , uint32_t o uint64_t dependiendo del rango que necesite. Esto se traduce naturalmente a entero 16, 32 y 64 en datos principales.

Para entender por qué, considere este escenario:

  1. Opta por utilizar el tipo Integer 64 para almacenar su valor.
  2. En un dispositivo iOS de 64 bits (por ejemplo, iPhone 6), almacena el valor 5,000,000,000.
  3. En un dispositivo iOS de 32 bits, este valor se obtiene de la tienda en un NSUInteger (usando NSNumber''s unsignedIntegerValue ).

Ahora, dado que NSUInteger solo tiene 32 bits en el dispositivo de 32 bits, el número ya no es de 5,000,000,000 porque no hay suficientes bits para representar 5 mil millones. Si hubiera cambiado el NUInteger en el paso 3 por uint64_t , el valor seguiría siendo de 5 mil millones.

Si es absolutamente necesario utilizar NSUInteger, solo deberá tener cuidado con los problemas descritos anteriormente y codificar a la defensiva.

En cuanto a almacenar valores sin firmar en los tipos de datos centrales aparentemente firmados, puede almacenarlos y recuperarlos de forma segura:

NSManagedObject *object = // create object object.valueNumber = @(4000000000); // Store 4 billion in an Integer 32 Core Data type [managedObjectContext save:NULL] // Save value to store // Later on NSManagedObject *object = // fetch object from store uint32_t value = object.valueNumber.unsignedIntegerValue; // value will be 4 billion