我应该使用 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的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 SQL 还是 Core Data?

NSFetchedResultsController 是不是应该始终与 Core Data 一起使用?

使用 NSPredicate Core Data 中的数据库字段执行计算

Core Data 应该只用于特定类型的数据模型还是可以一直使用?

如何使用 core-data 存储一个值? (迅速 2)

Core data multithreading fetch record