当我尝试使用decimalNumberByMultiplyingBy时,为什么NSDecimalNumber崩溃:?

时间:2013-08-13 19:14:00

标签: objective-c nsnumber

我正在尝试从用户默认值中检索一个数字并将其相乘。这是我的代码:

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'

这似乎是一件非常简单的事,但我的天啊!发生了什么事?

2 个答案:

答案 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并转换它更可靠。