2

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

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

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

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

知道发生了什么吗?

在此先感谢,
戴维德

4

2 回答 2

6

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

我认为,您必须将其存储为字符串。希望这是无损的。

于 2009-01-12T01:12:54.307 回答
5

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

于 2009-01-12T01:21:51.513 回答