我想将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)我可以安全地检索我的数据吗?
答案 0 :(得分:13)
你真的需要NSUInteger
的整个范围吗?在iOS上,这是一个无符号的32位值,可能会变得非常大。它会找到一个带符号的64位。
但是你可能不需要那么多精确度。 uint32_t
的最大值为UINT32_MAX
,即4,294,967,295(40亿)。如果你每秒递增一次,那么达到这个值需要超过136年。那时你的用户的iPhone不会出现......:)
答案 1 :(得分:8)
如果可能,在将数据写入磁盘或通过网络时,最好明确说明值的大小。不使用NSUInteger作为数据类型,而是使用uint16_t
,uint32_t
或uint64_t
,具体取决于您需要的范围。然后,这自然转换为Core Data中的Integer 16,32和64。
要了解原因,请考虑以下情况:
NSUInteger
(使用NSNumber的unsignedIntegerValue
)。现在因为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