发生了一些奇怪的事情。存储在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