NSDictionary initWithContentsOfFile:搞砸NSDecimalNumbers,为什么?

nut*_*ler 2 iphone cocoa cocoa-touch currency objective-c

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

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

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

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

什么事情都在发生?

在此先感谢
Davide

Pet*_*sey 6

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

我想你必须将它存储为字符串.希望,那是无损的.


Mar*_*ton 5

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