在我的iPhone应用中,我使用NSDecimalNumber
来存储一些货币汇率值。
我在第一次启动应用程序时从Web上提取数据,然后在它们过时时再次从中提取数据,然后将它们存储在NSDictionary
;然后我使用writeToFile:atomically:
。
首次启动应用时,我的费率转换方法可以正常工作。然而,当我第二次启动应用程序,并且费率加载-(NSDictionary*) initWithContentsOfFile:
时,转换方法停止工作,我得到了奇怪的结果。
我在有罪方法中使用断点进行了一些调试,我发现费率数据被视为NSCFNumber
,而不是NSDecimalNumber
。因此initWithContentsOfFile
似乎没有为我的对象分配正确的类。对于记录,这些对象的实际值(如description
方法中所示)对应于预期的速率值。
我还检查了writeToFile:atomically:
生成的plist文件,并看到费率存储为real
;我想知道这是否是正确的类型。
有什么想法吗?
提前致谢,
的Davide
答案 0 :(得分:6)
属性列表不区分十进制数和浮点数。 real
元素包含一个浮点数。 (实际上,序列化本身可能只是NSNumber
向自己发送floatValue
,而不知道该实例实际上是一个子类。这意味着当你生成<时会发生转换到浮点/ em> plist数据,而不是在你重读时。)
我认为你必须将它存储为字符串。希望这是无损的。
答案 1 :(得分:5)
Plists仅适用于某些数据类型,NSNumber就是其中之一。如果你想要NSDecimalNumber,那么你有两种方法可以解决它。第一种是继续使用plists,然后在加载后将所有NSNumber转换为NSDecimalNumbers。第二种是切换到使用NSKeyedArchiver来存储数据。这需要更多代码,但意味着如果你保存NSDecimalNumber,你将得到一个NSDecimalNumber。