我正在开发一款具有 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/