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 long 类型的 def ,它等于 unsigned int (iPhone 上的 Objective-c 类型

所以如果我使用 numberWithUnsignedInteger: 将我的 NSUInteger 转换为 NSNumber 并将其保存为 NSNumber(Integer 32) 我可以安全地检索我的数据吗?

4

2 回答 2

12

真的需要一个完整的范围NSUInteger吗?在 iOS 上,这是一个无符号的 32 位值,它可以变得非常大。它将找到有符号的 64 位。

但无论如何,您可能不需要那么精确。a 的最大值uint32_tUINT32_MAX4,294,967,295(40 亿)。如果你每秒增加一次,你需要超过 136 年才能达到这个值。到那时你的用户的 iPhone 就不会出现了...... :)

于 2012-01-13T20:44:26.083 回答
8

如果可能的话,在将数据写入磁盘或通过网络写入数据时,最好明确说明值的大小。而不是使用 NSUInteger 作为数据类型,使用uint16_t, uint32_t, 或uint64_t取决于您需要的范围。然后,这自然会转换为 Core Data 中的整数 16、32 和 64。

要了解原因,请考虑以下情况:

  1. 您选择使用 Integer 64 类型来存储您的值。
  2. 在 64 位 iOS 设备(例如 iPhone 6)上,它存储值 5,000,000,000。
  3. 在 32 位 iOS 设备上,这个值是从存储中获取的NSUInteger(使用 NSNumber 的unsignedIntegerValue)。

现在因为NSUInteger32 位设备上只有 32 位,所以数字不再是 5,000,000,000,因为没有足够的位来表示 50 亿。如果您将NUInteger步骤 3 中的值换成,uint64_t那么价值仍然是 50 亿。

如果您绝对必须使用 NSUInteger,那么您只需要对上述问题保持警惕并为其编写防御性代码。

至于将无符号值存储到看似签名的核心数据类型中,您可以安全地存储和检索它们:

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 回答