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

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

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

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

有什么想法吗?

提前致谢,
的Davide

有帮助吗?

解决方案

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top