我应该使用 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_t
、uint32_t
或 uint64_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的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchedResultsController 是不是应该始终与 Core Data 一起使用?
使用 NSPredicate Core Data 中的数据库字段执行计算