發生了一些奇怪的事情。存儲在NSUserDefaults中的NSNumber
我在NSUserDefaults中存儲了一個帶有無符號long long值的NSNumber。當我檢索它時,值剛剛改變。看起來系統認爲這個數字很長而不是無符號的long long。
更糟糕的是,當我比較從原來的號碼UserDefaults檢索的數,結果是NotEqual!
代碼有什麼問題?謝謝!
static NSString * const NumberKey = @"MyNumber";
unsigned long long value = 15908045869032883218ULL;
if ([[NSUserDefaults standardUserDefaults] objectForKey:NumberKey] == nil) {
NSNumber *number = [NSNumber numberWithUnsignedLongLong:value];
[[NSUserDefaults standardUserDefaults] setObject:number forKey:NumberKey];
NSLog(@"Original Number:%@", number); // 15908045869032883218, right
}
NSNumber *number = [[NSUserDefaults standardUserDefaults] objectForKey:NumberKey];
NSLog(@"Current Number:%@", number); // -2538698204676668398, weird
NSLog(@"Current Value:%llu", [number unsignedLongLongValue]); // 15908045869032883218, right
NSLog(@"%d", [number isEqualToNumber:[NSNumber numberWithUnsignedLongLong:value]]); // 0
NSLog(@"%d", [number unsignedLongLongValue] == value); // 1
我同意你的意見。但是,「如果兩個NSNumber對象具有相同的id值或者它們具有相同的值,則認爲它們是相等的」意味着我可以依賴isEqualToNumber:來確定兩個NSNumber對象的值,但是我的代碼的結果顯示I不能依靠這種方法。我必須自己決定值類型,並使用「XXValue」方法和「==」來比較兩個NSNumber對象,這是不方便的,因爲isEqual:方法用於許多其他對象,如NSArray,NSDictionary。 – Swordsfrog
@Swordfrog稍微深入研究一下您的問題的本質也與下面的答案有關。我將編輯我的原始答案以證明這一點。 –
謝謝,這只是解決了我的問題。 – Swordsfrog