Frage

Ich bin Umwandlung eines App Arbeit in 64-Bit. Die Apple-docs Zustand, dass der CGFloat Typ ist ein float auf 32-Bit und ein double auf 64-Bit.

Wenn das so ist, wie gehen Sie Codierung / Decodierung des Wertes? Zum Beispiel, wenn ein NSNumber von einem CGFloat zu schaffen, soll ich die -numberWithFloat: oder -numberWithDouble: Methode von NSNumber verwenden? Die gleiche Frage gilt für die NSCoder und NSKeyedArchiver Methoden -encodeFloat:forKey: und -encodeDouble:forKey:.

Muss ich eine bedingte Makro zu schreiben, so dass -numberWithFloat: auf 32-Bit- und -numberWithDouble: auf 64-Bit genannt wird?

Was passiert, wenn ein Benutzer auf die 64-Bit-Version der App läuft eine Datei speichert, wo diese Werte codiert werden als verdoppelt und die Datei geöffnet / unarchivierten auf einem 32-Bit-System?

Alle Methoden in meiner app, dass die Verwendung CGFloats unwahrscheinlich müssen immer die Präzision Niveau eines double, also sollte ich auch über diese besorgniserregend sein?

War es hilfreich?

Lösung

  

Was passiert, wenn ein Benutzer auf die 64-Bit-Version der App läuft eine Datei speichert, wo diese Werte codiert werden als verdoppelt und die Datei geöffnet / unarchivierten auf einem 32-Bit-System?

Nichts Besonderes. Die Datei enthält eine double und vermutlich decodeDouble:forKey: Sie senden den Wert abzurufen, so dass Sie ein double bekommen. Anschließend können Sie es zu CGFloat-der gegossen Präzision verlieren, wenn Sie auf einer 32-Bit-Maschinen sind, aber Sie haben die gegossen früher oder später zu tun. (Auch wenn Sie auf die double halten, werden Sie noch zu cast CGFloat haben, wenn Sie den Wert auf Quarz / AppKit / UIKit passieren.)

Betrachten Sie die Alternative: Sie speichern floats in der Datei auf einem 64-Bit-Maschine, und dann in auf der gleichen Maschine die Datei wieder laden. Sie und Quarz können die volle Genauigkeit der 64-Bit-double Art behandeln, aber Sie haben es nicht, weil du es weggeworfen, wenn Sie die Datei geschrieben werden. Wenn der Wert überhaupt in der Besetzung geändert, dass der Wandel ist jetzt permanent.

Also meine Empfehlung ist, mit NSKeyedArchiver die double Typ immer zu verwenden, es sei denn, Sie wissen, dass Sie nie nicht benutzen wollen alles andere als float (das heißt, das Ziel-API verwendet nur float, nie double). Dies gilt nicht für Quarz, so für CGFloat, Verwendung double.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top