77

NSUInteger をコア データに保持したいのですが、必要なスペースに合わせてどのタイプ (整数 16、32、64) を使用すればよいかわかりません。

私の理解から:

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

NSUInteger は、unsigned int に等しい unsigned long の型定義です ( iPhone では、objective-c の型) 。

NSUInteger を numberWithUnsignedInteger: で NSNumber に変換し、それを NSNumber(Integer 32) として保存すると、データを安全に取得できますか?

4

2 に答える 2

12

の全範囲が本当にNSUInteger必要ですか? iOS では、これは符号なしの 32 ビット値であり、非常に大きくなる可能性があります。署名付きの 64 ビットが検出されます。

しかし、とにかくそれほど精度は必要ありません。a の最大値uint32_tUINT32_MAX4,294,967,295 (40 億) です。1 秒に 1 回インクリメントすると、その値に達するまでに 136 年以上かかります。あなたのユーザーのiPhoneはそれまでに存在しません... :)

于 2012-01-13T20:44:26.083 に答える
8

可能であれば、データをディスクまたはネットワーク経由で書き込むときは、値のサイズを明示することをお勧めします。データ型として NSUInteger を使用する代わりに、uint16_t必要な範囲に応じて、、、uint32_tまたはを使用します。uint64_tこれは、Core Data の Integer 16、32、および 64 に自然に変換されます。

理由を理解するために、次のシナリオを検討してください。

  1. Integer 64 型を使用して値を保存することを選択します。
  2. 64 ビット iOS デバイス (iPhone 6 など) では、値 5,000,000,000 が格納されます。
  3. 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
于 2014-11-28T17:38:01.777 に答える