Codier- / Decodier CGFloat auf 32- vs 64-bit
-
20-09-2019 - |
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?
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 float
s 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
.