我正在开发一款具有游戏中心功能的游戏。
在内部,我的游戏保留了int64_t
类型变量的所有分数,因为这是通过GameKit
API报告分数所需的类型(我假设这是为了避免32位和64位平台之间的歧义)
到目前为止,非常好。
接下来,我希望在本地存储用户的权限(例如,在NSUserDefaults
中。但.plist是等效的),因为当没有经过身份验证的Game Center播放器时,以及通过iCloud键值与用户拥有的其他设备同步。
我可以 存储 这样的int64_t
组织:
// (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,并在每种情况下使用不同的方法),但不会&# 39;看起来很优雅。并不是说新的架构会很快出现,但是......
我也可以将数字存储为字符串,如this post中所述,但手头有字典友好的NSNumber,感觉很傻......
你会推荐什么?
答案 0 :(得分:7)
使用-[NSNumber longLongValue]
。 C标准(C99)保证long long
至少为64位。
顺便说一句,如果@(_hiscore)
为[NSNumber numberWithLongLong:_hiscore]
,则新的_hiscore
语法相当于int64_t
。