2

私のiPhoneアプリでは、NSDecimalNumberいくつかの通貨レート値を保存するために採用しています。アプリが最初に起動されたときに Web からデータを取得し、それらが廃止されたときに再度データを取得して、NSDictionary. それから私は使用しますwriteToFile:atomically:

アプリを初めて起動したとき、私のレート換算方法は問題なく動作します。しかし、アプリを 2 度目に起動すると、レートが-(NSDictionary*) initWithContentsOfFile:変換方法で読み込まれ、機能しなくなり、奇妙な結果が得られます。

問題のあるメソッドでブレークポイントを使用してデバッグを行ったところ、レート データがNSCFNumberではなくとして表示されることがわかりましたNSDecimalNumber。そのinitWithContentsOfFileため、オブジェクトに正しいクラスが割り当てられていないようです。レコードの場合、これらのオブジェクトの実際の値は、descriptionメソッドに示されているように、予想されるレート値に対応しています。

によって生成された plist ファイルも確認しwriteToFile:atomically:たところ、レートが として保存されていることがわかりましたreal。このタイプでいいのかな。

何が起こっているのですか?

前もって感謝します、
ダビデ

4

2 に答える 2

6

プロパティ リストは、10 進数と浮動小数点数を区別しません。このreal要素は浮動小数点数を保持します。(実際、シリアライゼーション自体は、インスタンスが実際にはサブクラスのものであることを認識せずに、単純にそれ自体にNSNumber送信floatValueしている可能性があります。つまり、浮動小数点への変換は、読み戻すときではなく、plist データを生成するときに発生します。)

文字列として保存する必要があると思います。うまくいけば、それは無損失です。

于 2009-01-12T01:12:54.307 に答える
5

plist は特定のデータ型でのみ機能し、NSNumber はその 1 つです。NSDecimalNumber が必要な場合は、2 つの方法があります。1 つ目は、plist を使用し続け、ロード後にすべての NSNumbers を NSDecimalNumbers に変換することです。2 つ目は、データの保存に NSKeyedArchiver を使用するように切り替えることです。これにはさらにコードが必要ですが、NSDecimalNumber を保存すると、NSDecimalNumber が返されることを意味します。

于 2009-01-12T01:21:51.513 に答える