我应该使用 Core Data 中的 NSNumber (Integer 16, 32, 64) 来保留 NSUInteger

Posted

技术标签:

【中文标题】我应该使用 Core Data 中的 NSNumber (Integer 16, 32, 64) 来保留 NSUInteger【英文标题】:What NSNumber (Integer 16, 32, 64) in Core Data should I use to keep NSUInteger 【发布时间】:2012-01-13 16:21:48 【问题描述】:

我想将 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 (Types in objective-c on iPhone)

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

【问题讨论】:

【参考方案1】:

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

但你可能并不需要那么精确。 uint32_t 的最大值为 UINT32_MAX,即 4,294,967,295(40 亿)。如果您每秒增加一次,则需要 136 年以上才能达到该值。到那时,您用户的 iPhone 将不在身边...... :)

【讨论】:

这并不能真正回答问题。你怎么知道他存储了什么样的数据?当我需要存储远大于 40 亿的数字时,我遇到过很多情况。 例如:var str2 = "small string with large hashValue"print(str2.hashValue)// 4799450061348893706 没有帮助 - 也许他正在使用 int 作为在 32 个单独属性上存储状态的一种方式 - 32 个会翻转所有位并使事情变得一团糟【参考方案2】:

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

要了解原因,请考虑以下场景:

    您选择使用 Integer 64 类型来存储您的值。 在 64 位 iOS 设备(例如 iPhone 6)上,它存储值 5,000,000,000。 在 32 位 iOS 设备上,此值从商店中获取到 NSUInteger(使用 NSNumber 的 unsignedIntegerValue)。

现在因为NSUInteger 在 32 位设备上只有 32 位,所以这个数字不再是 5,000,000,000,因为没有足够的位来表示 50 亿。如果您在第 3 步中将NUInteger 换成了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

【讨论】:

以上是关于我应该使用 Core Data 中的 NSNumber (Integer 16, 32, 64) 来保留 NSUInteger的主要内容,如果未能解决你的问题,请参考以下文章