在我的iPhone应用程序中,我使用NSDecimalNumber来存储一些货币汇率值。我在应用程序第一次启动时从web上提取数据,然后在它们过时时再次从web上提取数据,并将它们存储在NSDictionary中;然后我使用writeToFile:atomically:。
当应用程序第一次启动时,我的速率转换方法工作正常。然而,当我第二次启动应用程序时,-(NSDictionary*) initWithContentsOfFile:加载了rates,转换方法停止工作,我得到了奇怪的结果。
我在相关方法中对断点进行了一些调试,我发现rates数据被视为NSCFNumber,而不是NSDecimalNumber。所以看起来initWithContentsOfFile没有给我的对象分配正确的类。对于记录,这些对象的实际值,如description方法中所示,对应于预期的率值。
我还检查了writeToFile:atomically:生成的plist文件,发现rates被存储为real;我想知道这是否是正确的类型。
知道是怎么回事吗?
提前谢谢你,
戴维德
发布于 2009-01-12 01:12:54
属性列表不区分十进制数和浮点数。real元素包含一个浮点数。(实际上,序列化本身可能只是NSNumber将floatValue发送给它自己,而不知道实例实际上是一个子类。这意味着向浮点数的转换是在生成plist数据时发生的,而不是在读回数据时发生的。)
我想,您必须将其存储为字符串。希望这是无损的。
发布于 2009-01-12 01:21:52
Plist只适用于某些数据类型,NSNumber就是其中之一。如果你想要NSDecimalNumber,你有两种方法。第一种方法是继续使用NSDecimalNumbers,然后在加载后将所有的plist转换为plist。第二种方法是改用NSKeyedArchiver来存储数据。这需要更多的代码,但这意味着如果保存一个NSDecimalNumber,就会得到一个NSDecimalNumber。
https://stackoverflow.com/questions/434145
复制相似问题