ios - 从 NSDictionary : NSNumber vs NSString 存储和检索 int64_t

标签 ios objective-c 32bit-64bit game-center icloud

我正在开发一款具有 Game Center 功能的游戏。 在内部,我的游戏将所有分数保存在 int64_t 类型的变量中,因为这是通过 GameKit API 报告分数所需的类型(我假设这是为了避免 32 之间的歧义位和 64 位平台)。

到目前为止,还不错。

接下来,我希望在没有经过身份验证的 Game Center 播放器时将用户的 hiscore 存储在本地(例如,在 NSUserDefaults 中。但是 .plist 是等效的),并通过 iCloud 同步它键值与用户拥有的其他设备。

我可以像这样存储 int64_t hiscore:

// (int64_t) _hiscore is an ivar.
// (NSString) _playerID is the authenticated player ID, or else 
//  "AnonymousUser" when GKLocalPlayer is not authenticated.

[playerData setObject:@(_hiscore) forKey:@"HiScore"];
[[NSUserDefaults standardUserDefaults] setObject:playerData forKey:_playerID];
[[NSUserDefaults standardUserDefaults] synchronize];

...(假设“@( )”运算符在所有情况下都会采取适当的措施 - 对此也不确定...),但是我应该使用哪种 NSNumber 方法来 检索值而不冒整数溢出的风险?

该类的所有 -*value 方法(例如 -intValue-longValue-unsignedIntegerValue等)返回依赖于平台的类型(不像 int64_t,它有明确的字节大小)。 This post提供有关每个平台上所有数据类型的重要信息,但它对 NSNumber...

没有帮助

我可以对每个平台的不同类型的大小进行运行时检查(例如,查看 sizeof(unsigned long) 是否等于 4 或 8,并在每种情况下使用不同的方法),但那看起来并不优雅。并不是说很快就会出现新的架构,而是......

我还可以将数字存储为字符串,如 this post 中所述,但是手头有字典友好的 NSNumber,感觉很傻……

你会推荐什么?

最佳答案

使用-[NSNumber longLongValue]。 C 标准 (C99) 保证 long long 至少为 64 位。

顺便说一下,如果 _hiscore,新的 @(_hiscore) 语法等同于 [NSNumber numberWithLongLong:_hiscore] int64_t.

关于ios - 从 NSDictionary : NSNumber vs NSString 存储和检索 int64_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22937271/

相关文章:

java - 是否可以通过套接字将java对象发送到obj-c,然后将obj-c发送到java?

ios - 如何修复 64 位版本与 32 位版本中的 Coreplot 饼图问题

delphi - 为什么 64 位 Delphi 应用程序计算的结果与 32 位构建不同?

ios - 从 JSON 响应中创建一个数组

ios - 运行应用程序时字体发生变化

ios - 在 ios 中用于图像裁剪的圆形 mask

c++ - 将非托管 C++ 代码从 32 位转换为 64 位

ios - 带有 UICollectionView 的 xib - 不符合键值编码

ios - 使用数组值过滤字典

ios - 检测换行符在 UI​​TextView 中开始的时刻