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

时间:2014-04-08 12:38:30

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

我正在开发一款具有游戏中心功能的游戏。 在内部,我的游戏保留了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,感觉很傻......

你会推荐什么?

1 个答案:

答案 0 :(得分:7)

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

顺便说一句,如果@(_hiscore)[NSNumber numberWithLongLong:_hiscore],则新的_hiscore语法相当于int64_t