[英]Storing and retrieving an int64_t from an NSDictionary: NSNumber vs NSString
我正在開發一款具有Game Center功能的游戲。 在內部,我的游戲在int64_t
類型的變量中保存所有分數,因為這是通過GameKit
API報告分數所需的類型(我假設這是為了避免32位和64位平台之間的歧義)。
到現在為止還挺好。
接下來,我希望在本地存儲用戶的hiscore(例如,在NSUserDefaults
。但是.plist是等效的),因為當沒有經過身份驗證的Game Center播放器時,還要通過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不同,它具有明確的字節大小)。 這篇文章提供了關於每個平台上所有數據類型的精彩信息,但它對NSNumber
沒有幫助......
我可以對每個平台的區分類型的大小進行運行時檢查(例如,查看sizeof(unsigned long)
等於4或8,並在每種情況下使用不同的方法),但這看起來並不優雅 。 並不是說新架構會很快出現,但......
我還可以將號碼存儲為一個字符串,如在這個崗位 ,但手頭上有字典友好的NSNumber,感覺傻...
你會推薦什么?
使用-[NSNumber longLongValue]
。 C標准(C99)保證long long
至少為64位。
順便說一句,如果_hiscore
是int64_t
,新的@(_hiscore)
語法相當於[NSNumber numberWithLongLong:_hiscore]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.