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

时间:2012-01-13 16:21:49

标签: core-data nsuinteger

我想将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

所以如果我将NSUInteger转换为带有numberWithUnsignedInteger的NSNumber:并将其保存为NSNumber(整数32)我可以安全地检索我的数据吗?

2 个答案:

答案 0 :(得分:13)

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

但是你可能不需要那么多精确度。 uint32_t的最大值为UINT32_MAX,即4,294,967,295(40亿)。如果你每秒递增一次,那么达到这个值需要超过136年。那时你的用户的iPhone不会出现......:)

答案 1 :(得分: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)。
  4. 现在因为NSUInteger在32位设备上只有32位,所以这个数字不再是5,000,000,000,因为没有足够的位代表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