我应该使用哪个NSNumber(Core Data中的Integer 16、32或64)来存储NSUInteger?

80

我希望在我的核心数据中保留NSUInteger,但不知道应该使用哪种类型(integer 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) (Types in objective-c on iPhone)

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

2个回答

12

你真的需要整个 NSUInteger 范围吗?在 iOS 上,它是一个无符号的 32 位值,可以变得非常大。它会转换成一个有符号的 64 位值。

但实际上,你可能不需要那么多精度。一个 uint32_t 的最大值是 UINT32_MAX,即 4,294,967,295(40亿)。每秒增加一次,需要超过136年才能达到该值。到那时,用户的 iPhone 早已不在使用了... :)


34
这并没有真正回答问题。你怎么知道他正在存储什么类型的数据?我遇到过很多需要存储比40亿大得多的数字的情况。 - Brandon
例如: var str2 = "小字符串,具有大的哈希值" print(str2.hashValue) // 4799450061348893706 - Rich Armstrong
不太有帮助 - 或许他是使用 int 作为一种在 32 个单独属性上存储状态的方式 - 第 32 个属性会翻转所有位并搞乱事情。 - SimonTheDiver

8
如果可能的话,在将数据写入磁盘或通过网络传输时,最好明确指定值的大小。不要使用NSUInteger作为数据类型,而是根据需要的范围使用uint16_t、uint32_t或uint64_t。这自然地转换为Core Data中的Integer 16、32和64。
要了解原因,请考虑以下情况:
1.你选择使用Integer 64类型存储你的值。 2.在64位的iOS设备(例如iPhone 6)上它存储值5000000000。 3.在32位的iOS设备上,此值从存储区检索到一个NSUInteger(使用NSNumber的unsignedIntegerValue)。
现在因为32位的设备上NSUInteger仅有32位,所以这个数字不再是5000000000,因为没有足够的位来表示50亿。如果你将步骤3中的NUInteger替换为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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接