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:
- Opta por utilizar el tipo Integer 64 para almacenar su valor.
- En un dispositivo iOS de 64 bits (por ejemplo, iPhone 6), almacena el valor 5,000,000,000.
- En un dispositivo iOS de 32 bits, este valor se obtiene de la tienda en un
NSUInteger
(usando NSNumber''sunsignedIntegerValue
).
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