2009-11-17 17 views
9

私は64ビットで動作するようにアプリを変換しています。アップルのドキュメントによると、CGFloatタイプは、32ビットの場合はfloat、64ビットの場合はdoubleです。CGFloat on 32-対64ビットのエンコード/デコード

もしそうなら、その値のエンコード/デコードをどのように扱うのですか?たとえば、CGFloatからNSNumberを作成する場合、NSNumberの-numberWithFloat:または-numberWithDouble:メソッドを使用する必要がありますか?同じ質問がNSCoderNSKeyedArchiverの方法-encodeFloat:forKey:-encodeDouble:forKey:に適用されます。

-numberWithFloat:が32ビットで呼び出され、-numberWithDouble:が64ビットで呼び出されるように条件付きマクロを記述する必要はありますか?

64ビットバージョンのアプリケーションを実行しているユーザーが、これらの値が2倍にエンコードされたファイルを保存し、ファイルが32ビットシステムでオープン/アーカイブ解除されるとどうなりますか?

CGFloatsを使用する私のアプリのすべてのメソッドはdoubleの精度レベルを必要とすることはまずありませんので、これについても気にする必要がありますか?

答えて

12

64ビットバージョンのアプリケーションを実行しているユーザーが、これらの値が2倍にエンコードされ、ファイルが32ビットシステムでオープン/アーカイブ解除されたファイルを保存するとどうなりますか?

何もありません。ファイルにはdoubleが含まれており、decodeDouble:forKey:を送信して値を取得していると思われるので、doubleが表示されます。 CGFloatにキャストすることができます。これは、32ビットマシンでは精度が低下しますが、遅かれ早かれキャストする必要があります。 (あなたがdouble上に保持している場合でも、あなたはまだあなたがクォーツ/のAppKit/UIKitのに値を渡すときCGFloatにキャストする必要があります。)

は、代替手段を考えてみましょう:あなたは64上のファイルにfloat sのを保存しますその後、同じマシンにファイルをロードし直してください。あなたとQuartzは、64ビットのdoubleタイプの完全精度を扱うことができますが、ファイルを書き出したときに投げ捨てたので、あなたは持っていません。キャスト内で値がまったく変更されていない場合、その変更は永久になります。あなたは決してfloat以外のものを使用するつもりであることを知っている限り

だから私の勧告は、常にNSKeyedArchiverでdoubleタイプを使用することです(つまり、ターゲットAPIはfloat、決してdouble使用しています)。これはQuartzには当てはまらないので、CGFloatの場合はdoubleを使用してください。

+0

多くのありがとう、それは多くのものを明確にします。 –

関連する問題