我应该使用Core Data中的什么NSNumber(整数16、32、64)保留NSUInteger


72

我想将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是无符号long的def类型,它等于unsigned int(iPhone上的Objective-c中的类型

因此,如果我将我的NSUInteger转换为具有numberWithUnsignedInteger:的NSNumber并将其另存为NSNumber(Integer 32),我可以安全地取回数据了吗?

Answers:


13

真的需要整个范围NSUInteger吗?在iOS上,这是一个无符号的32位值,该值可能会非常大。它将找到一个签名的64位。

但是无论如何,您可能并不需要那么多的精度。为最大uint32_tUINT32_MAX其为4294967295(4十亿)。如果每秒增加一次,则需要超过136年的时间才能达到该值。您的用户的iPhone届时将不会出现... :)


33
这并不能真正回答问题。您如何知道他正在存储哪种数据?在很多情况下,我需要存储的数量远远超过40亿。
布兰登2014年

例如: var str2 = "small string with large hashValue" print(str2.hashValue) // 4799450061348893706
Rich Armstrong

无益的-也许他正在使用int作为将状态存储在32个单独的属性上的方式-32个属性会翻转所有位并
弄成

8

如果有可能,在将数据写入磁盘或通过网络写入数据时,最好明确说明其大小。而不是使用NSUInteger作为数据类型,使用uint16_tuint32_tuint64_t取决于你所需要的范围内。然后,这自然会转换为Core Data中的Integer 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,则只需要警惕上述问题并为其防御性地编写代码。

至于将未签名的值存储到看似已签名的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.