【问题标题】:What NSNumber (Integer 16, 32, 64) in Core Data should I use to keep NSUInteger我应该使用 Core Data 中的 NSNumber (Integer 16, 32, 64) 来保留 NSUInteger
【发布时间】:2012-02-09 20:14:06
【问题描述】:

我想将 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) 我可以安全地取回我的数据,对吗?

【问题讨论】:

    标签: core-data nsuinteger


    【解决方案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。

    要了解原因,请考虑以下场景:

    1. 您选择使用 Integer 64 类型来存储您的值。
    2. 在 64 位 iOS 设备(例如 iPhone 6)上,它存储值 5,000,000,000。
    3. 在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 2011-06-25
      相关资源
      最近更新 更多