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

Nic*_*ari 4 objective-c 32bit-64bit ios game-center icloud

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

到现在为止还挺好.

接下来,我希望将用户的hiscore存储在本地(例如,in 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];
Run Code Online (Sandbox Code Playgroud)

...(假设"@()"运算符将在所有情况下都要小心 - 不确定这个......),但是NSNumber我应该使用哪种方法来检索值而不会冒整数溢出的风险?

所有-*value类的方法(例如-intValue,-longValue,-unsignedIntegerValue等)的返回类型是平台相关的(不像的int64_t,它具有显式字节大小).这篇文章提供了关于每个平台上所有数据类型的精彩信息,但它对NSNumber... 没有帮助

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

我还可以将号码存储为一个字符串,如在这个岗位,但手头上有字典友好的NSNumber,感觉傻...

你会推荐什么?

ham*_*ene 7

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

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