我正在尝试从用户默认值中检索一个数字并将其相乘。这是我的代码:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSDecimalNumber *current = [prefs objectForKey:@"account"];
NSDecimalNumber *multiplier = [NSDecimalNumber decimalNumberWithString:@"1.15"];
NSDecimalNumber *floo = [current decimalNumberByMultiplyingBy: multiplier];
一旦碰到floo
线,就会给我一个非常可怕的崩溃。巨大的错误gobbledygook开始于:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector
sent to instance 0x8c7b1e0'
这似乎是一件非常简单的事,但我的天啊!发生了什么事?
答案 0 :(得分:5)
您已将[prefs objectForKey:@"account"]
的值分配给NSDecimalNumber变量,但实际值是NSNumber,而不是NSDecimalNumber。当您尝试在该对象上调用-decimalNumberByMultiplyingBy:
时,程序崩溃,因为该对象不知道如何处理该方法。
您可以将NSNumber转换为NSDecimalNumber,如下所示:
NSNumber *number = /* ... */
NSDecimalNumber *decimalNumber =
[NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]];
答案 1 :(得分:0)
最好使用归档器,例如将对象存储为:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:current] forKey:@"account"];
并检索它:
current = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"account"] ];
我认为这比看到你实际上有一个__NSCFNumber并转换它更可靠。