将(u)int64_t转换为NSNumbers

use*_*407 9 cocoa nsnumber uint64

所以基本上我的问题是,我正在创建一个使用uint64_t对象作为键的NSMutableDictionary.

有没有更好的方法来创建它们而不是这样做?

uint64_t bob=7;

NSNumber *bobsNumber;

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
bobsNumber=[NSNumber numberWithUnsignedLong:bob];
#else
bobsNumber=[NSNumber numberWithUnsignedLongLong:bob];
#endif
Run Code Online (Sandbox Code Playgroud)

只要你没有将它包含在二进制文件/套接字/ NSData对象/中,这就可以工作.但有没有更好的方法呢?我真的希望确保对象是64位,无论我在哪个平台上运行它.

我想我可以通过总是无条件的长整数来避免整个问题但当然如果我在任何有效数字中分配这些对象,那么在64位机器上浪费了大量的堆空间....

Jen*_*ton 16

long long在64位OS X/iOS平台上是64位.在所有OpenStep下载的平台上,numberWithUnsignedLongLong:是正确的uint64_t.

我上次检查时,您使用的工厂方法实际上并不影响所使用的表示形式; 它只取决于数字的值(除非你使用太小的尺寸,导致它被截断).

更新:这些天,正确的答案是NSNumber *bobsNumber = @(bob);.