NSDictionary initWithContentsOfFile:搞砸NSDecimalNumbers,为什么?

时间:2009-01-12 00:58:49

标签: iphone objective-c cocoa cocoa-touch currency

在我的iPhone应用中,我使用NSDecimalNumber来存储一些货币汇率值。 我在第一次启动应用程序时从Web上提取数据,然后在它们过时时再次从中提取数据,然后将它们存储在NSDictionary;然后我使用writeToFile:atomically:

首次启动应用时,我的费率转换方法可以正常工作。然而,当我第二次启动应用程序,并且费率加载-(NSDictionary*) initWithContentsOfFile:时,转换方法停止工作,我得到了奇怪的结果。

我在有罪方法中使用断点进行了一些调试,我发现费率数据被视为NSCFNumber,而不是NSDecimalNumber。因此initWithContentsOfFile似乎没有为我的对象分配正确的类。对于记录,这些对象的实际值(如description方法中所示)对应于预期的速率值。

我还检查了writeToFile:atomically:生成的plist文件,并看到费率存储为real;我想知道这是否是正确的类型。

有什么想法吗?

提前致谢,
的Davide

2 个答案:

答案 0 :(得分:6)

属性列表不区分十进制数和浮点数。 real元素包含一个浮点数。 (实际上,序列化本身可能只是NSNumber向自己发送floatValue,而不知道该实例实际上是一个子类。这意味着当你生成<时会发生转换到浮点/ em> plist数据,而不是在你重读时。)

我认为你必须将它存储为字符串。希望这是无损的。

答案 1 :(得分:5)

Plists仅适用于某些数据类型,NSNumber就是其中之一。如果你想要NSDecimalNumber,那么你有两种方法可以解决它。第一种是继续使用plists,然后在加载后将所有NSNumber转换为NSDecimalNumbers。第二种是切换到使用NSKeyedArchiver来存储数据。这需要更多代码,但意味着如果你保存NSDecimalNumber,你将得到一个NSDecimalNumber。