Dans la mesure du possible, lorsque vous écrivez des données sur un disque ou sur un réseau, il est préférable d'être explicite quant à la taille de la valeur. Au lieu d'utiliser NSUInteger comme type de données, utilisez uint16_t
, uint32_t
o uint64_t
en fonction de la plage dont vous avez besoin. Cela se traduit naturellement par Integer 16, 32 et 64 dans Core Data.
Pour comprendre pourquoi, considérez le scénario suivant :
- Vous choisissez d'utiliser le type Integer 64 pour stocker votre valeur.
- Sur un appareil iOS 64 bits (par exemple l'iPhone 6), il enregistre la valeur 5 000 000 000.
- Sur un appareil iOS 32 bits, cette valeur est extraite du magasin dans un fichier de type
NSUInteger
(en utilisant la fonction unsignedIntegerValue
).
Maintenant, parce que NSUInteger
n'est que de 32 bits sur le périphérique 32 bits, le nombre n'est plus 5 000 000 000 car il n'y a pas assez de bits pour représenter 5 milliards. Si vous aviez échangé le NUInteger
à l'étape 3 pour uint64_t
alors la valeur serait encore de 5 milliards.
Si vous devez absolument utiliser NSUInteger, vous devrez simplement vous méfier des problèmes décrits ci-dessus et coder de manière défensive.
En ce qui concerne le stockage de valeurs non signées dans les types de données de base apparemment signés, vous pouvez les stocker et les récupérer en toute sécurité :
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