可能であれば、データをディスクまたはネットワーク経由で書き込むときは、値のサイズを明示することをお勧めします。データ型として NSUInteger を使用する代わりに、uint16_t
必要な範囲に応じて、、、uint32_t
またはを使用します。uint64_t
これは、Core Data の Integer 16、32、および 64 に自然に変換されます。
理由を理解するために、次のシナリオを検討してください。
- Integer 64 型を使用して値を保存することを選択します。
- 64 ビット iOS デバイス (iPhone 6 など) では、値 5,000,000,000 が格納されます。
- 32 ビット iOS デバイスでは、この値は
NSUInteger
(NSNumber の を使用してunsignedIntegerValue
) ストアから にフェッチされます。
NSUInteger
は 32 ビット デバイスでは 32 ビットしかないため、50 億を表すのに十分なビットがないため、数値は 5,000,000,000 ではなくなりました。NUInteger
ステップ 3 で を交換した場合uint64_t
、値は 50 億のままです。
絶対に NSUInteger を使用する必要がある場合は、上記の問題に注意し、防御的にコーディングする必要があります。
符号なしの値を一見符号付きの Core Data 型に格納する限り、それらを安全に格納して取得できます。
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