2009-01-12 33 views
2

在我的iPhone应用程序中,我使用NSDecimalNumber来存储一些货币汇率值。 我第一次启动应用程序时,我从网络上获取数据,然后当它们变得过时时,再次将数据存储在NSDictionary;然后我使用writeToFile:atomically:NSDictionary initWithContentsOfFile:弄乱NSDecimalNumbers,为什么?

当应用程序第一次启动时,我的速度转换方法工作正常。但是,当我第二次启动应用程序时,费率会加载-(NSDictionary*) initWithContentsOfFile:转换方法停止工作,并且我得到奇怪的结果。

我在导入的方法中对断点进行了一些调试,发现费率数据为NSCFNumber,而不是NSDecimalNumber。所以看起来initWithContentsOfFile不会将正确的类分配给我的对象。为记录,这些对象的实际值(如description方法中所示)对应于预期的费率值。

我也检查了writeToFile:atomically:生成的plist文件,看到存储的价格为real;我想知道这是否是正确的类型。

想知道发生了什么?

由于提前,
达维德

回答

6

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

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

+0

我已经使用了使用字符串存储NSDecimalNumbers的方法,它似乎在保持精度方面做得很好。它看起来像你所能得到的那样接近无损。 – 2009-01-12 15:30:14

5

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

+0

请注意,如果属性列表序列化程序将数字视为NSNumbers,并在序列化*时询问其floatValue *,那么您已经失去了该点的精确性。现在拿回这些信息为时已晚。 – 2009-01-12 08:15:57

相关问题