0

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

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'

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

4

2 回答 2

5

您已将值分配[prefs objectForKey:@"account"]给 NSDecimalNumber 变量,但实际值是 NSNumber,而不是 NSDecimalNumber。当您尝试调用-decimalNumberByMultiplyingBy:该对象时,您的程序会崩溃,因为该对象不知道如何处理该方法。

您可以像这样将 NSNumber 转换为 NSDecimalNumber:

NSNumber *number = /* ... */
NSDecimalNumber *decimalNumber = 
    [NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]];
于 2013-08-13T19:16:25.797 回答
0

最好使用存档器,例如将对象存储为:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:current] forKey:@"account"];

并检索它:

current = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"account"] ];

我认为这比看到你实际上有一个 __NSCFNumber 并转换它更可靠。

于 2015-02-02T13:12:44.233 回答